“Diff” un’immagine usando ImageMagick

Come posso ottenere la differenza tra due immagini? Ho l’immagine originale. Qualcuno ha scritto su un duplicato esatto dell’immagine originale. Ora, ho bisogno di confrontare l’originale con l’immagine scritta ed estrarre solo la scrittura in formato immagine.

Esempio: ho una foto di una casa. Qualcuno ne ha preso una copia e ha scritto “Ciao!” Sulla copia. Voglio in qualche modo confrontare le due immagini, rimuovere la casa e lasciare un’immagine con le parole “Ciao!”.

È ansible con ImageMagick? So che ci sono modi per ottenere la differenza statistica tra le immagini, ma non è quello che sto cercando.

I miei preferiti sono questi due:

compare image1 image2 -compose src diff.png compare image1 image2 -compose src diff.pdf 

L’unica differenza tra i 2 comandi sopra: la prima mostra la differenza visiva tra le due immagini come file PNG, la seconda come PDF.

Il file diff risultante mostra tutti i pixel che sono diversi nel colore rosso. Quelli che sono immutati appaiono bianchi.

Breve e dolce.

Nota, le tue immagini non devono essere dello stesso tipo. Puoi anche mischiare JPEG, TIFF, PNG – in una condizione: le immagini devono essere della stessa dimensione (dimensione dell’immagine in pixel). Il formato di output è determinato dall’estensione del nome file di output.

Se, per qualche motivo, hai bisogno di una risoluzione più alta di quella predefinita (72 dpi), aggiungi semplicemente un parametro di -density appropriato:

  compare -density 300 image1 image2 -compose src diff.jpeg 

Esempi illustrati

Ecco alcune illustrazioni dei risultati per le variazioni del comando precedente. Nota: i due file confrontati erano persino file PDF , quindi funziona anche con questi (a patto che siano 1-cercapersone)!


A sinistra: immagine con centro testo : immagine originale a destra: differenze (= testo) in pixel rossi. Solo pixel di differenza rossi; i pixel identici sono bianchi

 compare \ porsche-with-scratch.pdf porsche-original.pdf \ -compose src \ diff-compose-default.pdf 

Questo è lo stesso comando che ho suggerito in precedenza.


A sinistra: immagine con testo Centro: immagine originale a destra: differenze nei pixel ‘verde mare’. Solo pixel di differenza Seagreen; i pixel identici sono bianchi

 compare \ porsche-with-scratch.pdf porsche-original.pdf \ -compose src \ -highlight-color seagreen \ diff-compose-default.pdf 

Questo comando aggiunge un parametro per fare la differenza pixel ‘seagreen’ invece del rosso predefinito.


A sinistra: immagine con centro testo : immagine originale a destra: diff. Blu (ma con alcuni contesti di contesto) Solo pixel di differenza blu; prima delle immagini confrontate come sfondo illuminato l

 compare \ porsche-with-scratch.pdf porsche-original.pdf \ -highlight-color blue \ diff-compose-default.pdf 

Questo comando rimuove la parte -compose src – il risultato è il comportamento predefinito di compare che mantiene come sfondo alleggerito la prima delle 2 immagini diffuse. (Questa volta con un parametro aggiunto per far apparire i pixel della diff in blu.)

Mentre compare fa un buon lavoro per molte applicazioni, ho scoperto che a volte preferisco un approccio diverso, in particolare quando si confrontano le immagini che sono per lo più in scala di grigi:

 convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \ '(' file2.png -flatten -grayscale Rec709Luminance ')' \ '(' -clone 0-1 -compose darken -composite ')' \ -channel RGB -combine diff.png 

L’idea è la seguente: convertire sia file1.png che file2.png in scala di grigi. Quindi trat il primo come canale rosso dell’immagine risultante, il secondo come canale verde. Il canale blu è formato da questi due usando l’operatore darken compose, che essenzialmente significa prendere il minimo.

Quindi le cose che sono bianche in entrambe le immagini rimangono bianche. Le cose che sono nere in entrambe le immagini rimangono nere. Cose che sono bianche nella prima immagine ma nere nella seconda volta in rosso, e cose che sono bianche nella seconda ma nere nella prima svolta in verde.

Il risultato ti offre un’immagine con un codice a colors in cui puoi facilmente associare il verde al primo input e il rosso al secondo. Ecco un esempio in cui sto usando questo per confrontare l’output di LaTeX con quello di KaTeX (prima ho corretto qualche bug per renderlo migliore):

inserisci la descrizione dell'immagine qui

È ansible combinare gli approcci, utilizzando il compare per vedere dove qualcosa è cambiato e quindi utilizzare quanto sopra per vedere più in dettaglio come è cambiato.