1.相加
- x+y
- cv2.add(x,y)
def add(self):
x=np.uint8([250])
y=np.uint8([10])
print(cv2.add(x,y))#260=>255
print(x+y)#260%256=4
plt.subplot(131), plt.title('raw'), plt.imshow(self.img,'gray'),plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.title('numpy'),plt.imshow(self.img+self.img,'gray'),plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.title('add'), plt.imshow(cv2.add(self.img,self.img),'gray'),plt.xticks([]), plt.yticks([])
plt.show()
2.混合
- cv2.addWeighted(x,0.5,y,0.5,0)
def blend(self):
#两张图片的shape要相同
img1=cv2.cvtColor(self.img,cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(cv2.imread('images/test2.jpg'),cv2.COLOR_BGR2RGB)
dst=cv2.addWeighted(self.img,0.5,img2,0.5,0)#alpha,beta,gamma是混合参数
dst1=cv2.cvtColor(dst,cv2.COLOR_BGR2RGB)
plt.subplot(131), plt.title('raw1'), plt.imshow(img1), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.title('raw2'), plt.imshow(img2), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.title('blend'), plt.imshow(dst1), plt.xticks([]), plt.yticks([])
plt.show()
3.位运算
- cv2.bitwise_not()
- cv2.bitwise_and()
- OR/XOR
我想把OpenCV 的标志放到另一幅图像上。如果我使用加法,颜色会改
变,如果使用混合,会得到透明效果,但是我不想要透明。如果他是矩形我可
以象上一章那样使用ROI。但是他不是矩形。但是我们可以通过下面的按位运
算实现:
def bit_compute(self):
img1=self.img
img2=cv2.imread('images/logo.png')
#让img2添加到img1上
rows,cols,channels=img2.shape
roi=img1[0:rows,0:cols]#在img上选取img2那么大的区域
#创建mask
img2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret,mask=cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)
mask_inv=cv2.bitwise_not(mask)
img1_bg=cv2.bitwise_and(roi,roi,mask=mask)
img2_fg=cv2.bitwise_and(img2,img2,mask=mask_inv)
dst=cv2.add(img1_bg,img2_fg)
img1[0:rows,0:cols]=dst
img1=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
plt.subplot(121), plt.title('img2'), plt.imshow(img2), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.title('add'), plt.imshow(img1), plt.xticks([]), plt.yticks([])
plt.show()