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()

最后效果为:

在这里插入图片描述
哈哈,很开心,学新的东西。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务