在本文中,我们将讨论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()
效果图如下:

