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()
最后效果为:

哈哈,很开心,学新的东西。
查看11道真题和解析