目标
- 算术运算,例如加法,减法,按位运算等。
- 功能:cv.add,cv.addWeighted等。
图像加法
您可以通过OpenCV函数cv.add()
或仅通过numpy操作res = img1 + img2
添加两个图像。两个图像应具有相同的维度和类型,或者第二个图像可以只是一个标量值。
注意 OpenCV加法和Numpy加法之间有区别。OpenCV加法是饱和运算,而Numpy加法是模运算。例如图像像素值介于0~255之间,饱和运算下10+255 = 255,模运算下10+255 = 10
>>> x = np.uint8([250])
>>> y = np.uint8([10])
>>> print( cv.add(x,y) ) # 250+10 = 260 => 255
[[255]]
>>> print( x+y ) # 250+10 = 260 % 256 = 4
[4]
当添加两个图像时,它将更加可见。OpenCV功能将提供更好的结果。因此,始终最好坚持使用OpenCV功能。
图像融合cv.addweighted
这也是图像加法,但是对图像赋予不同的权重,以使其具有融合或透明的感觉。根据以下等式添加图像:
通过从 从 更改,您可以在一个图像到另一个图像之间执行很酷的过渡。
若第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()
在图像上应用以下公式。
在这里,γ被视为零。
img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()
按位运算
这包括按位 AND
、 OR
、NOT
和 XOR
操作。它们在提取图像的任何部分、定义和处理非矩形 ROI 等方面非常有用。
例子:把 OpenCV 的标志放在一个图像上面。
添加两个图像,它会改变颜色。
混合它,得到一个透明的效果。
当希望它是不透明的。
如果是一个矩形区域,可以使用 ROI。
如不是长方形的,可以使用如下的按位操作来实现:opencv 提供了cvtColor()函数,用于在图像中不同的色彩空间进行转换,用于后续处理
opencv的python接口如下:
st = cv.cvtColor( src, code[, dst[, dstCn]]
- 函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。本函数支持的对图像取阈值的方法由 threshold_type 确定。
形式:cvThreshold(src, dst, double threshold, double max_value, int threshold_type );
src:原始数组 (单通道 , 8-bit of 32-bit 浮点数)。
dst:输出数组,必须与 src 的类型一致,或者为 8-bit。
threshold:阈值
max_value:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。
threshold_type:阈值类型 threshold_type=CV_THRESH_BINARY:
bitwise_and、bitwise_or、bitwise_xor、bitwise_not这四个按位操作函数。
bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 & src2
bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 | src2
bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 ^ src2
bitwise_not(InputArray src, OutputArray dst,InputArray mask=noArray());
# 加载两张图片
img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
# 我想把logo放在左上角,所以我创建了ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# 现在创建logo的掩码,并同时创建其相反掩码
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# 现在将ROI中logo的区域涂黑
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 仅从logo图像中提取logo区域
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将logo放入ROI并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()
请看下面的结果。左图显示了我们创建的mask。右图显示最终结果。为了更好地理解,显示上面代码中的所有中间映像,特别是 img1_bg 和 img2_fg。