Python PIL 值错误:图像不匹配。

30

我正在使用PIL玩耍,遇到了这个问题,但我看不出在文档中哪里出错了。这是我的简单代码:

from PIL import Image
from PIL.ImageChops import difference

imageA = Image.open("image1.png")
imageB = Image.open("image2.png")

if imageA.size == imageB.size:
    diff = difference(imageA, imageB)
    diff.save("test.png")

这让我遇到了错误

Traceback (most recent call last):
  File "C:\[XXX]\box-test.py", line 8, in <module>
    diff = difference(imageA, imageB)
  File "C:\Python32\lib\site-packages\PIL\ImageChops.py", line 123, in difference
    return image1._new(image1.im.chop_difference(image2.im))
ValueError: images do not match

非常感谢您的帮助。


9
imageA.mode == imageB.mode 的意思是“图像A的模式是否等于图像B的模式?” - cgohlke
1
好像是图像模式的问题,它们必须相同! - Mark Dunne
image1.pngimage2.png的尺寸是否相同? - Jan Spurny
2个回答

47

实际上,该函数的文档并没有提供太多信息。让我来试着澄清一下吧。首先,图像的大小与函数是否工作无关,它会内部检查两幅图像都适合的大小。

现在,什么时候可以使用ImageChops.difference函数比较图像呢?

首先,两幅图像都必须有像素可以存储在无符号字节中。这是一种非常常见的图像类型,但即使它们具有相同的模式,这也排除了比较它们之间的图像。因此,如果其中一个或/和两个图像的模式为:FII;16I;16LI;16BBGR;15BGR;16BGR;24BGR;32,则您不能比较图像xy。只要让它更清楚:如果它们恰好处于上述任何一种模式中,那么即使两个图像处于相同的模式也无法工作。

因此,只要这些图像具有相同数量的波段,并且处于模式1PLLARGBRGBARGBXRGBaCMYKYCbCr中,就可以进行比较。这意味着即使两幅图像不具有相同的模式,也可以进行比较。例如:difference(x.convert('CMYK'), x.convert('RGBA'))difference(x.convert('1'), x.convert('P'))都可以很好地工作。当然,这意味着difference(x.convert('LA'), x.convert('L'))会失败。最后,生成的图像模式始终等于传递给函数的第一幅图像的模式。

以上内容至少适用于PIL 1.1.7。


2

只需要验证每个层和图像的大小(例如1024 x 1024)


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