ImageChops.difference在简单的PNG图像上无法工作

4

我正在创建一个简单的脚本,用于检查图像是否相同或不同。

我的代码适用于jpg文件,但不适用于png文件。

由于某些原因,我的下面的代码认为下面的png图像:

enter image description here

与下面的png图像相同

enter image description here

from PIL import Image, ImageChops


img1 = Image.open('./1.png')
img2 = Image.open('./2.png')

img3 = Image.open('./A.jpg')
img4 = Image.open('./B.jpg')
diff1 = ImageChops.difference(img3, img4)
diff = ImageChops.difference(img2, img1)

print(diff.getbbox())
if diff.getbbox():
    diff.show() # does not work for me. should show image if they are different

print(diff1.getbbox())

if diff1.getbbox():
    diff1.show() # this works not sure why the PNG files do not

我在Ubuntu上运行这个程序。不确定我到底做错了什么。非常感谢任何帮助!

@Mark的帮助下,代码现在可以正常工作:https://github.com/timothy/image_diff/blob/master/test.py

1个回答

11

不确定这里到底在发生什么,但如果你拿出两张图片并将它们分成通道,然后使用 ImageMagick 将通道并排放置:

magick 1.png -separate +append 1ch.png

输入图像描述

输入图像描述

你可以看到红、绿、蓝三个通道都包含形状,但是多余的 alpha 通道(最右边的区域)没有作用,只会让 PIL 混淆!

如果你按照以下代码去掉 alpha 通道,它就能工作了:

img1 = Image.open('1.png').convert('RGB') 
img2 = Image.open('2.png').convert('RGB')
diff = ImageChops.difference(img2, img1)

diff.getbbox()
(28, 28, 156, 156)

差异图像:

enter image description here

我还注意到ImageChops.difference的文档中提到"其中一个图像必须为“1”模式",我不知道这是否是个问题。


非常感谢你,@Mark!那让我疯狂了 ☺ - Tim
谢谢!我有一些类似的代码,在Pillow 2.5.0和7.0.0中运行良好,但在7.1.0及更高版本中无法正常工作。一旦我将图像转换为“RGB”,它就可以再次正常工作了。 - craigsparks
边界框计算在Pillow 7.1.0中进行了更改。https://github.com/python-pillow/Pillow/issues/4849 - Yay295

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