- 图像加法
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()
结果: