使用OpenCV和Python叠加两个图像,且不失去颜色的强度。

5

如何在不失去两个图像颜色强度的情况下叠加两个图像。

我有图像1和图像2:

  1. enter image description here 2. enter image description here

我尝试使用0.5 alpha和beta,但它给我一个颜色强度减半的合并图像。

dst = cv2.addWeighted(img1,0.5,img2,0.5,0)

enter image description here

但是当我尝试将 alpha 和 beta 通道都设置为1时,它仅给出了合并的区域。
 dst = cv2.addWeighted(img1,1,img2,1,0)

enter image description here

我必须获得这样的输出。

enter image description here


你能添加你的原始图像吗? - Mazdak
我添加了原始图像1和图像2。 - Mon Tolentino
BGR 中,purple(255, 0, 255) = blue(255, 0, 0) + red(0, 0, 255) - Kinght 金
1个回答

6
实际上,dst 是根据以下公式创建的:
dst = src1*alpha + src2*beta + gamma

这段话的意思是,当你使用alpha乘以实际上是3D数组的图像时,你会将所有项目都乘以。例如,对于一个蓝色像素,你有[255, 0, 0],而白色则是[255, 255, 255],当你将矩阵相加时,如果你想要结果为蓝色,你应该将白色像素转换为0,实际上是黑色(从物理角度来看没有意义)。你可以使用高级numpy索引来找到白色像素,然后将它们转换为零。

import cv2    

img1 = cv2.imread('img1.png')
img2 = cv2.imread('img2.png')

img1[img1[:, :, 1:].all(axis=-1)] = 0
img2[img2[:, :, 1:].all(axis=-1)] = 0

dst = cv2.addWeighted(img1, 1, img2, 1, 0)

cv2.imshow('sas', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

这是图片描述


1
dst = img1 + img2 在将白色设置为黑色后应该可以很好地运行,而且更容易/更短。 - Miki
@Miki 确实,我只是想给出一个通用的答案,特别是接近 OP 的意图。 - Mazdak
非常感谢!但是我如何在DST上将黑色背景设置为白色?非常感谢! - Mon Tolentino
@MonTolentino,现在dst中没有黑色了。它是蓝色、紫色和红色的,因为你混合了这些图像。 - Mazdak
但是它会影响我正在处理的图像,我必须将所有黑色像素再次设置为白色。非常感谢。 - Mon Tolentino
1
好的,我使用了以下代码: img[np.where((img == [0,0,0]).all(axis = 2))] = [255,255,255] - Mon Tolentino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接