图像算术运算(加法、减法、按位运算)
目标:
-
算术运算:加法,减法,按位运算原理
-
主要函数:cv2.add(), cv2.addWeighted()…
1、图像加法
使用opencv的函数,cv2.add(img1, img2)
,也可以使用numpy数组的加法操作,res = img1+img2
,两幅图像大小、类型必须一致,或者第二个图像是一个简单的标量值。
Opencv的加法和Numpy的加法是不一样的,看下面列子
可以看到Opencv中的加法,溢出后取的是饱和值也就是最大范围值,而numpy中加法饱和后重新计数(模操作),所以一般用Opencv的加法比较好。
-
图像混合
-
图像混合是加法的一种特例,只是不是直接相加而是有一个权重,这样可以塑造混合或者透明的效果。
-
混合的数学公式如下:
g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g(x)=(1-\alpha)f_0(x)+\alpha f_1(x) g(x)=(1−α)f0(x)+αf1(x)
通过修改 α \alpha α 的值(0—〉1)来调节混合度。 -
函数cv2.addWeighted(img1, α \alpha α, img2, (1- α \alpha α))
代码如下:
# -*- encoding: utf-8 -*- import cv2 import numpy as np def callback(object): pass cv2.namedWindow('image') img1 = cv2.imread('empire.jpg') [x, y, z] = img1.shape # 创建一个相同规格的图像,可以自己读取一张图用切片工具 # 选出相同大小的矩阵 img2 = np.zeros([x, y, z], img1.dtype) B, G, R = 10, 88, 21 # 自己调色 img2[:, :, 0] = np.uint8(B) img2[:, :, 1] = np.uint8(G) img2[:, :, 2] = np.uint8(R) cv2.createTrackbar('alpha', 'image', 0, 100, callback) while True: Alpha = cv2.getTrackbarPos('alpha', 'image')/100 img3 = cv2.addWeighted(img1, Alpha, img2, 1-Alpha, 0) cv2.imshow('image', img3) if cv2.waitKey(10) & 0xFF == ord('q'): break cv2.destroyAllWindows()
- sorry录制效果欠佳
-
按位运算
-
按位操作有: AND, OR, NOT, XOR 等,在我们提取ROI时,通常不是矩形或者椭圆形的,而是根据图像的某些特征选取,这时巧妙运用这些按位操作是很方便的。
-
例如我项想把下面的图像放在另一个图像上面,如果使用前面的混合选项,会造成两个图像变得透明(变得范白不清楚),而我只想把logo部分添加上去其他部分不需要。
import cv2
import numpy as np
img1 = cv2.imread('opencvlogo.jpg')
img2 = cv2.imread('fisherman.png')
rows, cols, channels = img1.shape
roi = img2[0:rows, 0:cols]
img2gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
ret, Mask = cv2.threshold(img2gray, 170, 255, cv2.THRESH_BINARY)
Mask_inv = cv2.bitwise_not(Mask)
img1_bg = cv2.bitwise_and(roi, roi, mask=Mask)
img1_fg = cv2.bitwise_and(img1, img1, mask=Mask_inv)
dst = cv2.add(img1_bg, img1_fg)
img2[0:rows, 0:cols] = dst
cv2.imshow('res', Mask)
cv2.imshow('das', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
-
效果