在本文中,我们将讨论Python OpenCV Image Blending(图像融合),如果您对使用Python编程语言进行GUI开发感兴趣,请查看这个(https://www.linuxmi.com/python)链接。

根据OpenCV文档, 图像融合也是图像叠加,但是为图像赋予了不同的权重,从而使图像具有混合或透明的感觉。根据以下等式叠加图像:

通过改变  ,您可以在一个图像到另一个图像之间执行一个很酷的转换。

在这里,我使用了两个图像,将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。 cv2.addWeighted() 在图像上应用以下等式。图像混合cv.addWeighted()是一种图像加权相加的操作,两幅图像的权重可以不一样,也可以一样。

下面是图像融合的完整示例

import cv2

img1 = cv2.imread("linuxmi.com.jpg")
img2 = cv2.imread("linuxmi.jpg")

dist = cv2.addWeighted(img1, 0.75, img2, 0.25,0)

cv2.imshow("www.linuxmi.com", dist)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:这些代码是用来读取图像的,确保图像的大小和类型相同。此外,还需要在工作目录中添加图像。

img1 = cv2.imread(“linuxmi.com.jpg”)
img2 = cv2.imread(“linuxmi.jpg”)

用此方法,您可以在OpenCV中应用图像融合

dist = cv2.addWeighted(img1, 0.75, img2, 0.25,0)

运行完整的代码,这将是结果

第2种方式:通过位运算实现图像的叠加

我们如何将这个logo加到右边图片里呢?

如果使用cv.add()那么颜色肯定加深 如果使用cv.addWeight()又会出现透明, 那怎么办呢?

我们可以使用位运算,然后运用掩码的性质就可以得到了。

我们可以首先将logo的颜色空间进行转换,转换成灰度图像,然后使用阀值函数,将我们的logo提取出来,然后将其他部分变为黑色,即像素值为0。

完整代码

import cv2 as cv
import numpy as np

if  __name__ == "__main__":
    img = cv.imread("linuxmi.com.png") #LOGO
    img1 = cv.imread("linuxmi.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.imshow("linuxmi.com", img1)
    cv.waitKey()
    cv.destroyAllWindows()

效果图如下:

发表评论

电子邮件地址不会被公开。 必填项已用*标注