2012-09-06 13 views
10

Sto giocando con PIL e ho trovato questo problema e non riesco a vedere dove nei documenti sto sbagliando. Qui è il mio semplice codicePython PIL ValueError: le immagini non corrispondono

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

che mi dà l'errore

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 

Qualsiasi aiuto sarebbe apprezzato

+5

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

+1

Sembra che fosse un problema con le modalità immagine, dovevano essere uguali! –

+0

Ha 'image1.png' le stesse dimensioni di' image2.png'? –

risposta

19

La documentazione per questa funzione non dice molto in realtà. Quindi fammi provare a chiarirlo un po '. In primo luogo, le dimensioni delle immagini sono irrilevanti rispetto al fatto che la funzione funzioni o no, ma internamente controlla la dimensione di entrambe le immagini.

Ora, quando è possibile confrontare le immagini utilizzando la funzione ImageChops.difference?

Prima di tutto, entrambe le immagini devono avere pixel che possono essere memorizzati in un byte senza segno. Questo è un tipo di immagine molto comune, ma questo esclude il confronto tra le immagini anche se sono la stessa modalità. Quindi, non si può paragonare un'immagine x e y quando uno o/entrambi/di loro hanno un modo di: F, I, I;16, I;16L, I;16B, BGR;15, BGR;16, o BGR;32. Giusto per chiarire: non importa se entrambe le immagini sono nella stessa modalità se si trovano in una delle modalità sopra, la funzione si rifiuterà di funzionare.

Quindi, il confronto può essere fatto quando le immagini sono nei modi 1, P, L, LA, RGB, RGBA, RGBX, RGBa, CMYK o YCbCr fintanto che hanno lo stesso numero di bande. Ciò significa che le immagini non devono avere la stessa modalità per essere confrontate. Ad esempio, difference(x.convert('CMYK'), x.convert('RGBA')) o difference(x.convert('1'), x.convert('P')) funzionano bene. Ovviamente questo significa difference(x.convert('LA'), x.convert('L')), fallisce. Infine, l'immagine risultante avrà sempre la modalità uguale alla prima immagine passata alla funzione.

Questo è valido almeno per il PIL 1.1.7.

Problemi correlati