Python-OpenCV(4)

来源:互联网 发布:idea新建普通java项目 编辑:程序博客网 时间:2024/06/05 16:51

我想把 NBA 的标志放到另一幅图像(LBJ传球)上。但是现在有个问题:
如果我使用加法,颜色会改变,如果使用混合,会得到透明效果,但是我不想要透明的
于是我们可以通过下面的按位运算实现:

cv2.bitwise_and()
cv2.bitwise_or()
cv2.bitwise_xor()
cv2.bitwise_not()

这些API的意思,就是你看到的,AND、OR、XOR、NOT 二值运算,相信这些大家肯定都懂


代码:

__author__ = 'gavinzhou'# -*- coding: utf-8 -*-import cv2# read the imagesim1 = cv2.imread("./images/1.png")im2 = cv2.imread("./images/logo.jpg")# show the original imagescv2.imshow("IM1", im1)cv2.imshow("IM2", im2)# set the ROIroi = im1[0:im2.shape[0], 0:im2.shape[1], :]cv2.imshow("ROI", roi)# create mask of the im2im2_gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)ret, mask = cv2.threshold(im2_gray, 180, 255, cv2.THRESH_BINARY)mask_inv = cv2.bitwise_not(mask)# get the bg and fg image of im2im2_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)im2_fg = cv2.bitwise_and(im2, im2, mask=mask)# add the roi to fg imageim_dst = cv2.add(im2_bg, im2_fg)# set the image region to im1im1[0:im2.shape[0], 0:im2.shape[1], :] = im_dst# show all the imagescv2.imshow("IM2_BG", im2_bg)cv2.imshow("IM2_FG", im2_fg)cv2.imshow("FIN_FG", im1)cv2.waitKey(9000)cv2.destroyAllWindows()

结果:
原始的小图(im1和im2)

原始的图片

roi和bg和fg

最终结果

结果上看的出来,我已经把NBA的logo放到了LBJ的图上,这种效果就类似与PS的图层效果,一层归一层互不影响,如果使用加法会改变原来的颜色,混合则会产生透明,对于图层的效果,使用位运算是最好的

0 0