2012-09-06 32 views
10

Estoy jugando con PIL y me encontré con este problema y no puedo ver en qué parte de los documentos estoy equivocado. Aquí está mi código simplePython PIL ValueError: las imágenes no coinciden

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") 

que me da el error

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 

Cualquier ayuda se agradece

+5

¿'imageA.mode == imageB.mode'? – cgohlke

+1

Parece que fue un problema con los modos de imagen, ¡tenían que ser lo mismo! –

+0

¿Tiene 'image1.png' las mismas dimensiones que' image2.png'? –

Respuesta

19

La documentación para esta función no dice mucho, de hecho. Así que déjame intentar aclararlo un poco. En primer lugar, los tamaños de las imágenes son irrelevantes para saber si la función funciona o no, internamente comprueba el tamaño que encajan las dos imágenes.

Ahora, cuando se puede comparar las imágenes con la función ImageChops.difference?

En primer lugar, ambas imágenes deben tener píxeles que se pueden almacenar en un byte sin signo. Este es un tipo de imagen muy común, pero esto excluye la comparación entre imágenes, incluso si son del mismo modo. Por lo tanto, no se puede comparar una imagen x y y cuando uno o/ambos/de ellos tienen un modo de: F, I, I;16, I;16L, I;16B, BGR;15, BGR;16, o BGR;32. Para dejarlo en claro: no importa si ambas imágenes están en el mismo modo si están en uno de los modos anteriores, la función se negará a funcionar.

Por lo tanto, la comparación se puede hacer cuando las imágenes están en los modos 1, P, L, LA, RGB, RGBA, RGBX, RGBa, CMYK o YCbCr, siempre y cuando tengan el mismo número de bandas. Esto significa que las imágenes no tienen que tener el mismo modo para comparar. Por ejemplo, difference(x.convert('CMYK'), x.convert('RGBA')) o difference(x.convert('1'), x.convert('P')) funcionan bien. Por supuesto, esto significa difference(x.convert('LA'), x.convert('L')), falla. Finalmente, la imagen resultante siempre tendrá el modo igual a la primera imagen pasada a la función.

Esto es válido al menos para el PIL 1.1.7.

Cuestiones relacionadas