python-opencv:图像位运算
1.cv2.add():
函数功能:将两个图片进行加和,大于255的使用255计数,需注意两输入图像image1和image2需要有相同的宽/高和通道数。
cv2.add(image1, image2)
参数:
1)img1:图片对象1
2)img2:图片对象2
3)mask:None(掩膜,一般用灰度图做掩膜,img1和img2相加后,和掩膜与运算,从而达到掩盖部分区域的目的;)
4)dtype:-1
2.cv2.addWeighted():
函数功能:将两个图片加权叠加,需注意两输入图像image1和image2需要有相同的宽/高和通道数。
cv2.addWeighted()
参数:
1)img1:图片对象1
2)alpha:img1的权重
3)img2:图片对象2
4)beta:img1的权重
5)gamma:常量值,图像相加后再加上常量值
6)dtype:返回图像的数据类型,默认为-1,和img1一样
(img1*alpha+img2*beta+gamma)
3.cv2.btwise_and():
函数功能:两图像按位与操作,两个输入图像需要有相同的形状。
经常看到的result = cv2.btwise_and(img1, img1,mask)的操作相当于对img1l保留mask部分,其余部分置0。
cv2.btwise_and():
参数:
1)img1:图片对象1
2)img2:图片对象2
3)mask:掩膜
4.cv2.btwise_and():
函数功能:两图像按位或操作,两个输入图像需要有相同的形状。
cv2.bitwise_or():
参数:
1)img1:图片对象1
2)img2:图片对象2
3)mask:掩膜
5.cv2.btwise_xor():
函数功能:异或运算,相同为1,不同为0。
cv2.bitwise_xor()
参数:
1)img1:图片对象1
2)img2:图片对象2
3)mask:掩膜
6.cv2.btwise_not():
函数功能:非运算,对输入图像按位取反。
cv2.bitwise_not(): 非运算
参数:
1)img1:图片对象1
2)mask:掩膜
7.如何对不同尺寸的图像进行叠加操作:
import cv2
import numpy as np
import matplotlib.pylab as plt
# 引入两个图片,第二个是logo
img1 = cv2.imread('data/2.jpg')
img2 = cv2.imread('data/maskFace.jpg')
plt.subplot(231),plt.imshow(img1)
plt.subplot(232),plt.imshow(img2)
# 设定图1的roi,注意:对roi的操作就是对img1的操作
r1,c1,ch1 = img1.shape
r2,c2,ch2 = img2.shape
# roi确定了图2所在图1的位置
roi = img1[r1-r2:r1, c1-c2:c1 ]
# 图2(logo)转换为灰度图
gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
# 对图2阈值分割得到mask1(获取0~100部分)
# 保留mask1部分的roi
ret, mask1 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV)
fg1 = cv2.bitwise_and(roi,roi,mask=mask1)
plt.subplot(233),plt.imshow(fg1)
plt.subplot(234),plt.imshow(mask1)
# 对图2图2阈值分割得到mask2(获取100~255部分)
# 保留mask2部分的img2
ret, mask2 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
# 保留img2的logo背景部分
fg2 = cv2.bitwise_and(img2,img2,mask = mask2)
plt.subplot(235),plt.imshow(fg2)
# 图像叠加
roi[:] = cv2.add(fg1, fg2)
plt.subplot(236),plt.imshow(img1)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()