【问题标题】:Python PIL ValueError: images do not matchPython PIL ValueError:图像不匹配
【发布时间】:2012-08-30 18:36:17
【问题描述】:

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

任何帮助将不胜感激

【问题讨论】:

  • imageA.mode == imageB.mode?
  • 看起来是图像模式的问题,它们必须相同!
  • image1.png 的尺寸与 image2.png 相同吗?

标签: python python-imaging-library


【解决方案1】:

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

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

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

因此,当图像处于1PLLARGBRGBARGBXRGBa、@ 模式时,可以进行比较987654341@ 或 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 有效。

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 2020-04-22
    • 2022-08-07
    • 2021-08-01
    • 2021-05-05
    • 2015-11-29
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多