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]
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"]]
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]
ImageDifference
dà 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]
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]
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]
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]