- 圖像加法
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()
結果:
- 按位運算(與掩膜結合使用)
這里包括的按位操作有: AND, OR, NOT, XOR 等。當我們提取圖像的一部分,選擇非矩形 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()
結果: