Wszystkie pakiety przetwarzania obrazu powinny to ułatwić. Pokażę ci, jak to zrobić w Mathematica, jeśli masz dostęp do tego systemu. Mathematica jest językiem programowania, ale naprawdę łatwo jest wykonywać tego rodzaju manipulacje, więc jeśli masz do niego dostęp (np. Za pośrednictwem licencji witryny uniwersyteckiej), polecam spróbować!
Najpierw zaimportuj obraz:
img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]
Ponownie skompresuj go za pomocą kompresji JPEG
img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]
Teraz weź różnicę wartości pikseli, konwertując je najpierw na liczby zmiennoprzecinkowe, aby zapewnić zachowanie wartości ujemnych.
diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]
Na obrazie różnicy niewiele widać (różnica jest niewielka), a wartości ujemne są przycinane na czarno. Przeskalujmy więc wszystkie wartości, aby wypełnić cały zakres dynamiczny (minimum zostanie przeskalowane do 0, maksimum do 1):
ImageAdjust[diff]
ImageDifference
daje absolutną różnicę między dwoma obrazami i nie wytwarza liczb ujemnych. Jest to operacja, którą częściej można znaleźć w pakietach do przetwarzania obrazów, szczególnie w GUI (Photoshop, GIMP).
ImageDifference[img, img2]
Możemy również wziąć pojedynczy kanał RGB, na przykład czerwony, i wizualizować pozytywne i negatywne różnice za pomocą „przeciwnych” kolorów:
ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
Oto to samo, z różnicami powiększonymi 5 razy. Artefakty JPEG są teraz bardziej rozpoznawalne.
ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
Zaletą używania języka programowania jest to, że możemy go łatwo zautomatyzować i zobaczyć, jak zmienia się różnica dla „poziomów kompresji” między 0,1 a 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]