Усі пакети обробки зображень повинні робити це просто. Я покажу вам, як це зробити в Mathematica, якщо у вас є доступ до цієї системи. Mathematica - мова програмування, але робити ці маніпуляції дуже просто, тому якщо у вас є доступ до неї (наприклад, через ліцензію на сайт університету), я рекомендую вам перейти!
Спочатку імпортуйте зображення:
img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]
Повторно натисніть його за допомогою стиснення JPEG
img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]
Тепер візьміть різницю піксельних значень, перетворивши їх спочатку в числа з плаваючою точкою, щоб гарантувати збереження від’ємних значень.
diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]
На зображенні різниці видно не багато (різниця крихітна), а негативні значення обрізані на чорному. Тож давайте змінимо масштаб усіх значень, щоб заповнити весь динамічний діапазон (мінімум буде масштабуватися до 0, максимальний - до 1):
ImageAdjust[diff]
ImageDifference
дає абсолютну різницю двох зображень і не дає негативних чисел. Це операція, яку ви частіше зустрічаєте в пакетах для обробки зображень, особливо у графічному інтерфейсі (Photoshop, GIMP).
ImageDifference[img, img2]
Ми також можемо взяти один канал RGB, наприклад червоний, та візуалізувати позитивні та негативні відмінності за допомогою "протилежних" кольорів:
ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
Ось те саме, з різницею, посиленою в 5 разів. Артефакти JPEG зараз більш впізнавані.
ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
Перевага використання мови програмування полягає в тому, що ми можемо легко автоматизувати це і побачити, як різниця змінюється на "рівні стиснення" між 0,1 і 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]