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/両方/のモードが、、、、、、、、、、、またはの場合。明確にするために、両方の画像が同じモードであるかどうかは関係ありません。これらが上記のモードのいずれかにある場合、関数は機能しません。FII;16I;16LI;16BBGR;15BGR;16BGR;24BGR;32

したがって、比較は、画像がモード、、、、、、、、、、、または1同じ数のバンドを持っている限り、行うことができます。これは、画像を比較するために同じモードである必要がないことを意味します。たとえば、またはうまく機能します。もちろん、これは、失敗することを意味します。最後に、結果の画像は常に、関数に渡される最初の画像と同じモードになります。PLLARGBRGBARGBXRGBaCMYKYCbCrdifference(x.convert('CMYK'), x.convert('RGBA'))difference(x.convert('1'), x.convert('P'))difference(x.convert('LA'), x.convert('L'))

これは、少なくともPIL1.1.7では有効です。

于 2013-01-25T16:59:13.520 に答える