Python Pillow:如何将一个二值图像叠加在另一个图像之上以产生合成图像?

Python Pillow: how to overlay one binary image on top of another to produce a composite?

我正在做一些图像处理,我需要检查一个二进制图像是否与另一个相同。

处理速度不是问题,我想做的简单事情是计算将图像 A 的反转添加到图像 B 后剩余的白色像素(这些图像几乎完全相同,但不完全——将它们评为或多或少相同对我的情况很重要)。

但是,为了创建合成图像,我需要包含一个 "mask",它与两个图像的大小相同。

我无法找到在线创建掩码并将其用于 Image.composite 函数的示例。

这是我的代码:

compA = ImageOps.invert(imgA)
imgAB = Image.composite(compA,imgB,??? mask)

现在,我创建了一个全零掩码——但是,合成图像显示不正确(A 和 B 是完全相同的图像;一个全零掩码——或全为重要——不起作用)。

mask = Image.fromarray(np.zeros(imgA.size,dtype=int),mode='L')
imgAB = Image.composite(compA,imgB,mask)

这个面具是如何工作的?

如何将这两个二进制图像叠加在一起?

显然您正在使用 numpy,那么为什么不直接使用 numpy 数组并在该域中明确地执行您想要执行的任何算术运算——例如从另一个图像中减去一个图像:

arrayA = numpy.asarray( imgA, dtype=int )
arrayB = numpy.asarray( imgB, dtype=int )

arrayDelta = arrayA - arrayB

print( (arrayDelta !=0 ).sum() )  # print the number of non-identical pixels (why count them by hand?)
# NB: this number may be inflated by a factor of 3 if there are 3 identical channels R, G, B

imgDelta = Image.fromarray((numpy.sign(arrayDelta)*127+127).astype('uint8'))  # display this image if you want to visualize where the differences are

您可以更简单地执行此操作,例如

print((numpy.asarray(imgA) != numpy.asarray(imgB)).sum())

但我认为首先转换为有符号整数类型然后减去可以让您可视化更多信息(A 白色和 B 黑色 -> 三角形中的白色像素;A 黑色和 B 白色 -> 三角形中的黑色像素)