Tous les packages de traitement d'image devraient faciliter cela. Je vais vous montrer comment le faire dans Mathematica, si vous avez accès à ce système. Mathematica est un langage de programmation, mais il est vraiment facile de faire ce genre de manipulations, donc si vous y avez accès (par exemple via une licence de site universitaire), je vous recommande de l'essayer!
Tout d'abord, importez l'image:
img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]
Recompressez-le en utilisant la compression JPEG
img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]
Prenez maintenant la différence des valeurs de pixels, convertissez-les d'abord en nombres à virgule flottante pour vous assurer que les valeurs négatives sont préservées.
diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]
Peu de choses sont visibles sur l'image de différence (la différence est minuscule) et les valeurs négatives sont écrêtées en noir. Redimensionnons donc toutes les valeurs pour remplir toute la plage dynamique (le minimum sera mis à l'échelle à 0, le maximum à 1):
ImageAdjust[diff]
ImageDifference
donne la différence absolue des deux images et ne produit aucun nombre négatif. C'est l'opération que vous êtes le plus susceptible de trouver dans les packages de traitement d'image, en particulier ceux de l'interface graphique (Photoshop, GIMP).
ImageDifference[img, img2]
Nous pouvons également prendre un seul canal RVB, par exemple le rouge, et visualiser les différences positives et négatives en utilisant des couleurs «opposées»:
ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
Voici la même chose, avec des différences amplifiées 5 fois. Les artefacts JPEG sont désormais plus reconnaissables.
ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
L'avantage d'utiliser un langage de programmation est que nous pouvons facilement automatiser cela et voir comment la différence change pour les "niveaux de compression" entre 0,1 et 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]