Come posso sapere esattamente cosa è cambiato tra due immagini?


28

Ad esempio, per una recente conversazione sulla compressione JPEG ho voluto confrontare pixel per pixel cosa è cambiato tra due JPEG (uno con livello di compressione 100 e uno con livello di compressione 95).

Come posso generare buone mappe visive di ciò che è cambiato senza una noiosa programmazione software personalizzata?


2
Non inviarlo come risposta poiché probabilmente non è una soluzione praticabile per le foto, ma GitHub (sito di un programmatore) ha alcuni modi interessanti di confrontare le immagini: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Prova a fare clic "2-up", "Swipe", "Onion Skin" e "Difference".
Henrik N,

Risposte:


35

Photoshop + livelli FTW. (Sì, puoi anche usare Gimp o qualsiasi altro software di editing con le stesse funzioni.)

Inizia con la tua immagine di base, nel caso sopra, ho usato l'immagine di qualità jpeg 100.

  1. crea un nuovo livello sopra di esso
  2. incolla la seconda immagine in quel livello
  3. imposta lo stile del livello su "differenza" (vedi la freccia rosa sinistra nella prima immagine in basso)
  4. creare un livello effetto sopra quello (Livello> Nuovo livello di regolazione> Soglia)
  5. imposta l'effetto sulla soglia (vedi la freccia rosa a destra nella prima immagine in basso)
  6. impostare il valore di soglia su 1

Nell'immagine risultante, qualsiasi pixel che sia in qualche modo diverso tra le due immagini sarà bianco. Puoi regolarlo per consentire alle cose di essere "un po 'diverse" modificando il valore di soglia.

Esempio che mostra MOLTA differenza tra jpeg 92 e 100 da Lightroom. confrontando jpeg 92 e 100 da LR con i livelli di Photoshop

Esempio che non mostra alcuna differenza tra 95 e 100. confrontando jpeg 95 e 100 da LR con i livelli di Photoshop

Non è solo mostrare un binario "cambiato o no", e se volessi maggiori dettagli su quanto è cambiato, diciamo per canale di colore?

  1. sostituire il livello di regolazione della soglia con un livello di regolazione delle curve.
  2. modifica la curva
  3. attiva mostra ritaglio
  4. prendi la maniglia bianca di input sotto l'angolo in basso a destra e trascinala verso sinistra, per quanto puoi andare
  5. torna lentamente a destra fino a quando non vedi alcun ritaglio (l'immagine di anteprima è tutta nera)
  6. disattiva il ritaglio e salva la modifica della curva

Più sono luminosi i pixel risultanti, più sono diversi in quel colore. Il rovescio della medaglia però è che si finisce con un sacco di fango grigio ... quindi a volte è più semplice limitarsi a sottrarlo per vedere dove sono le differenze. Ecco perché costruisco entrambi e seleziono quale è visibile.

visione più descrittiva della differenza


Nuova domanda, ma come si fa a fare il punto 4, "creare un livello effetto sopra quello"? Non riesco a trovarlo da nessuna parte. Sono passati anche 7 anni e sto usando l'ultima versione per sempre che hanno cambiato anche il nome?
Whitneyland,

14

Se usi Photoshop, ecco come lo farei:

Inserisci i due jpeg nello stesso file psd, in due livelli separati. Dovrebbero sovrapporsi esattamente, poiché le loro dimensioni sono le stesse. (quale va in cima non importa).

Imposta il metodo di fusione dei livelli su "Differenza". Vedresti un risultato per lo più nero. Dipende dalla differenza di qualità tra i due livelli originali che potresti vedere più o meno del rumore.

inserisci qui la descrizione dell'immagine


La differenza da sola non aiuta molto quando sei lasciato con un grande vuoto nero come quello. :)
cabbey,

@cabbey certo, confrontando il 100% con il 95% molto probabilmente otterrai un nero solido. Ma è questa la domanda che ti ponevi, vero? Nella risposta del proprietario, stai modificando i valori rispetto agli originali da confrontare, il che li rende non avere più le impostazioni di compressione originali.
Jin

Il nero è praticamente solido su qualsiasi confronto, perché le differenze sono così piccole. Il livello soglia / curva dopo la differenza non fa nulla per le impostazioni di compressione, aiuta solo la visualizzazione dei limiti inferiori di quella zuppa nera preparata dalla differenza. (Non sono sicuro al 100% di cosa intendevi, quindi potrei andare in una direzione diversa lì ....)
Cabbey,

@cabbey se stai chiedendo un'operazione bit-saggia della differenza tra le 2 immagini, allora il solo metodo di fusione "Differenza" ti dà questo. Quando si regola la soglia / curva, anche se il risultato è più evidente a occhio nudo, ma non è una rappresentazione accurata di ciò che è cambiato. Quando lo fai, non stai più confrontando un 100% con un 95%.
Jin

Sicuro che lo sei. Il livello di compressione ha smesso di importare se il secondo photoshop ha caricato l'immagine dal disco nei suoi buffer interni, ora è un array di pixel non compresso in memoria ... se quei pixel sono arrivati ​​lì perché l'immagine aveva una macchia quadrata lì o perché sono un artefatto del livello di compressione non è rilevante.
Cabbey,

13

Tutti i pacchetti di elaborazione delle immagini dovrebbero renderlo semplice. Ti mostrerò come farlo in Mathematica, se hai accesso a questo sistema. Mathematica è un linguaggio di programmazione, ma è davvero facile fare questo tipo di manipolazioni, quindi se hai accesso ad esso (ad esempio tramite una licenza di un sito universitario), ti consiglio di provarlo!

Innanzitutto, importa l'immagine:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

Ricomprimilo usando la compressione JPEG

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Grafica Mathematica

Ora prendi la differenza dei valori dei pixel, convertendoli prima in numeri in virgola mobile per garantire che i valori negativi vengano conservati.

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Grafica Mathematica

Non molto è visibile sull'immagine della differenza (la differenza è minuscola) e i valori negativi sono troncati in nero. Quindi ridimensioniamo tutti i valori per riempire l'intero intervallo dinamico (il minimo verrà ridimensionato su 0, il massimo su 1):

ImageAdjust[diff]

Grafica Mathematica

ImageDifferencedà la differenza assoluta delle due immagini e non produce numeri negativi. Questa è l'operazione che è più probabile trovare nei pacchetti di elaborazione delle immagini, in particolare quelli della GUI (Photoshop, GIMP).

ImageDifference[img, img2]

Grafica Mathematica

Possiamo anche prendere un singolo canale RGB, ad esempio quello rosso, e visualizzare le differenze positive e negative usando colori "opposti":

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Grafica Mathematica

Ecco la stessa cosa, con le differenze amplificate 5 volte. I manufatti JPEG sono ora più riconoscibili.

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Grafica Mathematica

Il vantaggio dell'uso di un linguaggio di programmazione è che possiamo facilmente automatizzare questo e vedere come cambia la differenza per "livelli di compressione" tra 0,1 e 1,0:

Grid@Partition[Table[
   ArrayPlot[
    0.5 + ImageData[
      First@ColorSeparate[
        ImageSubtract[Image[img, "Real"], 
         Image[ImportString@
           ExportString[img, "JPEG", "CompressionLevel" -> c], 
          "Real"]], "Red"]], ColorFunction -> "RedGreenSplit", 
    ColorFunctionScaling -> False],
   {c, 0.1, 1, 0.1}
   ], 5]

Grafica Mathematica


È sempre bello vedere un'opzione di script / automatizzata! :)
jrista

5

Puoi usare gli strumenti della riga di comando di Imagemagick.

composite imagesrc1.jpg imagesrc2.jpg -compose difference diffs.jpg

fornirà il valore assoluto delle differenze per ciascun canale RGB.



0
  1. Apri una delle immagini in GIMP o Photoshop.
  2. Aggiungi la seconda immagine come nuovo livello sopra la prima.
  3. Imposta la modalità di fusione del livello superiore su "Differenza"

Nell'immagine risultante le parti nere mostrano dove le immagini originali sono identiche e qualsiasi cosa più chiara mostra differenze.


La differenza da sola non aiuta molto quando sei lasciato con un grande vuoto nero come quello. :)
cabbey,

Puoi sempre regolare i livelli sull'immagine risultante. Ogni volta che ho usato questa tecnica ho avuto immagini abbastanza diverse da poter vedere i cambiamenti :)
Dan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.