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()

 

结果:

 

posted @ 2019-07-17 16:11  bingma  阅读(2198)  评论(0编辑  收藏  举报