OpenCV之通过位运算实现图像的叠加(Python实现)
)
我们如何将这个logo加到右边图片里呢?
如果使用cv.add()那么颜色肯定加深
如果使用cv.addWeight()又会出现透明
, 那怎么办呢?
我们可以使用位运算,然后运用掩码的性质就可以得到了。
我们可以首先将logo的颜色空间进行转换,转换成灰度图像,然后使用阀值函数,将我们的logo提取出来,然后将其他部分变为黑色,即像素值为0。
这部分代码为:
img2gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 颜色空间的转换 ret, mask = cv.threshold(img2gray, 20, 255, cv.THRESH_BINARY)# 掩码 黑色 cv.namedWindow("image", cv.WINDOW_AUTOSIZE) cv.imshow("image", mask)
然后我们得到它相反的图像,使用cv.bitwise_not
,得到
那么我们接下来就可以嵌入了,首先我们得原图像还原,那么只需要使用
img1_bg = cv.bitwise_and(img, img, mask=mask)
得到
因为mask的性质就是非0的地方保留原样,其余为0
接下来我们利用mask_inv去取得messi那张图的背景部分。
代码为:
img2_fg = cv.bitwise_and(roi, roi, mask=mask_inv)
这样得到
那么最后只需要使用cv.add即可
完整代码
import cv2 as cv import numpy as np if __name__ == "__main__": img = cv.imread("E:/OpenCv/logo.jpg") #LOGO img1 = cv.imread("E:/OpenCv/messi5.jpg") #MESSI # look(img) rows, cols, channels = img.shape roi = img1[0:rows, 0:cols] #获得messi的ROI img2gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 颜色空间的转换 ret, mask = cv.threshold(img2gray, 20, 255, cv.THRESH_BINARY)# 掩码 黑色 mask_inv = cv.bitwise_not(mask)# 掩码取反 白色 # #取mask中像素不为的0的值,其余为0 img1_bg = cv.bitwise_and(img, img, mask=mask) img2_fg = cv.bitwise_and(roi, roi, mask=mask_inv) dst = cv.add(img1_bg, img2_fg) img1[0:rows, 0:cols] = dst cv.namedWindow("image", cv.WINDOW_AUTOSIZE) cv.imshow("image", mask) cv.imshow("mask_inv", mask_inv) cv.imshow("img1_bg", img1_bg) cv.imshow("img2_fg", img2_fg) cv.imshow("image", img1) cv.waitKey() cv.destroyAllWindows()
最后效果为:
哈哈,很开心,学新的东西。