25

我正在玩 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

任何帮助,将不胜感激

4

1 回答 1

40

事实上,这个函数的文档并没有说明太多。所以让我试着澄清一下。首先,图像的大小与函数是否工作无关,它在内部检查两个图像都适合的大小。

现在,您何时可以使用该函数实际比较图像ImageChops.difference

首先,两个图像都必须具有可以存储在无符号字节中的像素。这是一种非常常见的图像类型,但这不包括图像之间的比较,即使它们是相同的模式。因此,您无法比较图像x,并且y当其中一个或/两个/具有以下模式时:F, I, I;16, I;16L, I;16B, BGR;15, BGR;16, BGR;24, 或BGR;32。只是为了明确一点:如果两个图像恰好处于上述模式之一,则它们是否处于相同模式并不重要,该功能将拒绝工作。

因此,可以在图像处于 , , , , , , , , , 模式时进行比较1P或者L只要LA它们RGB具有RGBA相同RGBX数量RGBaCMYK波段YCbCr。这意味着图像不必具有相同的模式来进行比较。例如,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 有效。

于 2013-01-25T16:59:13.520 回答