1. 程式人生 > >OpenCV位運算實現影象融合

OpenCV位運算實現影象融合

OpenCV在計算機視覺處理方面提供了很多強大的工具,使用OpenCV可以很容易的對影象進行各種算數運算,本文主要介紹通過位運算把兩張圖片融合成一張圖片,可用於新增水印等。

      在網上隨意找了兩張圖,一張是google logo,一張是deep learning圖片:

google logo
deep learning

     使用OpenCV把google logo作為水印新增到deep learning圖上,最終效果如下:

added_img

實現思路

      把google logo 圖片除了google這幾個字以外的畫素都變為0;把deep learning圖片需要嵌入google logo圖片的位置上的畫素都變為0;那麼最後把兩張圖片畫素相加的時候,除了google這幾個字,其他的畫素值都是deep learning的畫素。

實現步驟

1.載入圖片,圖片相加需要有相同的寬和高,所以先構建一個新的圖片google_resize,大小和 dl_img 相同

google_logo = cv2.imread('google.jpg')  # google logo 圖片
dl_img = cv2.imread('dl.jpg')   # deep learning 圖片

google_resize = np.ones(dl_img.shape, np.uint8)
google_resize = google_resize * 255  # 白色背景
google_resize[0:google_logo.shape[0
], 0:google_logo.shape[1]] = google_logo
google_resize
  1. 構建mask和mask_inv影象
google_logo_gray = cv2.cvtColor(google_resize, cv2.COLOR_BGR2GRAY)
# 閾值操作,灰度值大於200的畫素點位置賦值255,其他畫素點位置賦值0
ret, mask = cv2.threshold(google_logo_gray, 200, 255, cv2.THRESH_BINARY)  
# 取反操作,mask中255的畫素點值變為0, 值為0的畫素點新值為255
mask_inv = cv2.bitwise
_not(mask)
mask
mask_inv
  1. 對影象應用mask
google_logo_fg = cv2.bitwise_and(google_resize, google_resize, mask = mask_inv)
dl_bg = cv2.bitwise_and(dl_img, dl_img, mask = mask)
google_logo_fg
dl_bg
  1. 影象相加融合,得到最終結果
added_img = cv2.add(google_logo_fg, dl_bg)
added_img

相關推薦

OpenCV運算實現影象融合

OpenCV在計算機視覺處理方面提供了很多強大的工具,使用OpenCV可以很容易的對影象進行各種算數運算,本文主要介紹通過位運算把兩張圖片融合成一張圖片,可用於新增水印等。       在網上隨意找了兩張圖,一張是google logo,一張是deep

23.運算實現加法

turn 結果 add urn () pre col body class 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int add(int a, int b) 5 { 6

運算實現四則運算之加減乘除(用運算求一個數的1/3) via Hackbuteer1

esp sub 沒有 正整數 過程 介紹 異或 sin 完成 轉自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位異或;&:按位與; | :按位或 計算機系統中,數值一律用補碼來表示:因為

c-1:運算:實現整數的加減乘除四則運算

首先回憶計算機組成原理學過的內容,數字在機器ALU運算邏輯單元內部是以補碼形式進行運算的,因為補碼有兩個優勢:1、能做到符號位和數值部分一起運算,這樣無需單獨考慮符號。2、能把減法運算轉化為加法運算來處理。3、補碼的沒有正0和負0之分,所以表示範圍比原碼和反碼多1個。問題一: 位運算實現加法不管是十進位制加法

使用運算實現加減乘除

在不使用+,-,*,/,四則運算子號的情況下,通過基本位運算實現加減乘除四則運算。 1. C++中使用位運算實現加法 首先,我們通過對x和y進行&位運算,得出每一位上的進位。然後對x和y進行^位運算,得出沒有加進位的和。最後將所得的和當做新的x,所得的進位往

c語言用運算實現兩個數平均數

c語言用位運算實現兩個數平均數 對於十進位制而言,向右移動一位就是除以10, 對於二進位制而言,向右移動一位就是除以2, 對於八進位制而言,向右移動一位就是除以8, 對於十六進位制而言,向右移動一位就是除以16 因為計算機是通過二進位制來計算的,知道這個規律之後我們可以編寫程式碼 int

運算實現四則運算之加減乘除(用運算求一個數的1/3)

                聽同學百度二面中,不準用四則運算操作符來實現四則運算。一想就想到了計算機組成原理上學過的。位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。加法運算:int AddWithoutArithmetic(int num1,int num2){ if(n

運算實現求絕對值-有效避開if-else判斷

一般情況下,如果要我們寫一個求絕對值的函式,我們的實現很有可能會是這樣: template<class T>T abs_Normal(T tNum){    if(tNum >0.0)        return tNum;    elsereturn-tNum;} 也就

[LeetCode][7]Reverse Integer解析與運算實現 -Java實現

Q: Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 A: 以下解法和程式碼沒有借閱以往任何資料,如果有更好的解法請在評論區留言 這

c基礎【一】利用運算實現數字反轉

#include <stdio.h> #include <stdlib.h> int main() { //通過位運算實現數字的反轉(操作的物件必須是整數) unsigned int original =0x123; unsig

【演算法】位元計算(A+B Problem)-運算子介紹、運算實現加減乘除

問題描述 問題:計算A+B,不適用“+”運算子(LintCode 1.A + B Problem) 注意:A B均為32位整數,可使用位元位計算 解決思路 演算法示例 程式碼如下:(通過LintCode測試) class Solution

運算-實現加減乘除

res oid font ont 分享圖片 != family highlight args 基本性質:1:~n=-(n+1),比如:~3=-4     2:獲取整數n的二進制串中最後一個1:-n&n=~(n-1)&n  

運算實現十進位制轉換為二進位制

程式碼如下: 1 #include <iostream> //將十進位制數轉化為二進位制數,位運算的取位操作 2 using namespace std; 3 int main() 4 { 5 unsigned short i; 6

《程式設計之美 》2.1 運算實現—交換兩個整數、求和、整數的二進位制表達中1的個數

序 能否利用位運算高效的實現部分演算法是面試中的常見考題,現在講該部分總結如下。 一、不用額外變數交換兩個整數的值 void exchange(int &a , int &b) {

運算實現四則運算之加減乘除

//遞迴版本 int _add(int num1,int num2){ int sum,carry; if(num2==0) return num1;//沒有進位的時候完成運算 sum=num1^num2;//完成第一步沒有進位的加法運算

opencv之分水嶺實現影象分割

本文需要了解的庫函式有: void cvWatershed( const CvArr* image, CvArr* markers );//分水嶺演算法分割影象void cvAddWeighted( const CvArr* src1, double alpha,

利用運算實現兩個整數的加法運算,請程式碼實現,並作簡要說明。

#include <stdio.h>      int main(void) {        int add(int a,int b);       int m,a,b;       scanf("%d,%d",&a,&b);       m

OpenCV學習 kmeans實現影象分割

using namespace std; using namespace cv; int main() { const int MAX_CLUSTERS = 5; Vec3b colorTab[] = { Vec3b(0, 0, 255), Vec3b(0,

opencv學習日記之影象融合

這裡的影象疊加指線性疊加,設影象A的畫素為fA(x),影象B的畫素為fB(x),疊加係數為α,則線性疊加操作為: α為0-1之間的值,從上面也可以看出,疊加必需保證兩幅輸入影象的尺寸大小相同。

利用運算實現加密解密

public static void main(String[] args) { // TODO 自動生成方法存根 Scanner scanner = new Scanner(System.in); System.out.println("請輸入要加密的英文字串或