OpenCV-圖像算數運算-圖像加法、圖像混合、按位運算(掩膜結合)


  • 圖像加法

  opencv中加法是cv2.add(img1, img2),numpy中加法 img = img1 + img2

  二者區別:opencv的加法是一種飽和操作,而numpy的加法是一種模操作,這種差別在你對兩幅圖像進行加法時會更加明顯。 OpenCV 的結果會更好
一點。所以盡量使用 OpenCV 中的函數。

  

1 x = np.uint8([250]) # 8位, 數據限制在0-255
2 y = np.uint8([10])
3 
4 print(cv2.add(x, y)) # 250+10 = 260 => 255
5 
6 print(x + y) # 250+10 = 260 % 256 = 4

 

  • 圖像混合

  本質也是加法,只是兩幅圖的權重不同,混合后會形成透明效果,計算公式如下:

            dst = α · img1 +  (1-α)img2 + γ ,其中 α 取值0 - 1

  函數為cv2.addWeighted(), 要求兩個圖像的大小必須相同  

代碼:

 1 import numpy as np
 2 import cv2
 3 from matplotlib import pyplot as plt
 4 
 5 img1 = cv2.imread("image/sight.jpg")
 6 img2 = cv2.imread("image/min.jpg")
 7 img1 = img1[0:340, 0:500, :]
 8 img2 = img2[0:340, 0:500, :]
 9 
10 a = 0.3
11 
12 img = cv2.addWeighted(img1, 0.3, img2, 0.7, 0)
13 cv2.imshow('dst',img)
14 cv2.waitKey(0)
15 cv2.destroyAllWindows()

結果:

 

  • 按位運算(與掩膜結合使用)

  這里包括的按位操作有: ANDORNOTXOR 等。當我們提取圖像的一部分,選擇非矩形 ROI 時這些操作會很有用 。

代碼如下:

 1 import numpy as np  2 import cv2  3 from matplotlib import pyplot as plt  4 
 5 logo = cv2.imread("image/logo.jpg") # 讀取logo
 6 img = cv2.imread("image/min.jpg") # 讀取人物圖片
 7 logo = logo[..., ::-1]  8 img = img[..., ::-1]  9 
10 rows, cols, channels = logo.shape 11 roi = img[0:rows, 0:cols] # 在人物圖片的左上角取logo圖像大小的區域
12 
13 logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY) 14 
15 # 創建logo圖像的掩膜矩陣(前景為255,背景變為0)
16 ret, mask = cv2.threshold(logo_gray, 20, 255, cv2.THRESH_BINARY) 17 
18 # 取反(前景為0,背景變為255)
19 mask_inv = cv2.bitwise_not(mask) 20 
21 # 與mask_inv與運算,人物圖像左上角區域背景不變,前景(圖標)為0,黑色
22 img_bg = cv2.bitwise_and(roi, roi, mask = mask_inv) 23 
24 # 與mask與運算,logo的前景(突變)不變,背景為0(黑色)
25 img_fg = cv2.bitwise_and(logo, logo, mask = mask) 26 
27 # 加運算,人物圖像的左上角,背景不變,前景變成圖標
28 dst = cv2.add(img_bg,img_fg) 29 img[0:rows, 0:cols ] = dst 30 
31 plt.subplot(231), plt.imshow(mask, cmap="gray"), plt.title('mask') 32 plt.subplot(232),plt.imshow(mask_inv, cmap='gray'),plt.title('mask_inv') 33 plt.subplot(233),plt.imshow(img_bg, cmap='gray'),plt.title('img_bg') 34 plt.subplot(234),plt.imshow(img_fg, cmap='gray'),plt.title('img_fg') 35 plt.subplot(235),plt.imshow(dst, cmap='gray'),plt.title('dst') 36 plt.subplot(236),plt.imshow(img, cmap='gray'),plt.title('img') 37 plt.show()

 

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM