Як я можу точно сказати, що змінилося між двома зображеннями?


28

Наприклад, для недавньої розмови про стиснення JPEG я хотів порівняти піксель для пікселя, який змінився між двома JPEG (один зі ступенем стиснення 100 та другий із рівнем стиснення 95).

Як створити хороші візуальні карти того, що змінилося без стомлюючого користувальницького програмування?


2
Не надсилаючи це як відповідь, оскільки це, мабуть, не є життєздатним рішенням для фотографій, але GitHub (сайт програміста) має цікаві способи порівняння зображень: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Спробуйте натиснути "2-up", "Swipe", "цибульна шкіра" та "Difference".
Генрік N

Відповіді:


35

Photoshop + Шари FTW. (Так, ви також можете використовувати Gimp або будь-яке інше програмне забезпечення для редагування з тими ж функціями.)

Почніть зі свого базового зображення, у випадку, наведеному вище, я використовував зображення якості jpeg 100.

  1. створити поверх нього новий шар
  2. вставити друге зображення в цей шар
  3. встановіть стиль шару на "різниця" (див. ліву рожеву стрілку на 1-му зображенні нижче)
  4. створити шар ефекту вгорі, який (Шар> Новий шар коригування> Поріг)
  5. встановити поріг ефекту (див. праву рожеву стрілку на 1-му зображенні нижче)
  6. встановити значення порогового значення 1

У отриманому зображенні будь-який піксель, який будь-яким чином відрізняється між двома зображеннями, буде білим. Ви можете налаштувати його, щоб дозволити «дещо відрізнятися», змінивши порогове значення.

Приклад показує багато різниці між jpeg 92 і 100 від Lightroom. порівнюючи jpeg 92 і 100 з LR з шарами Photoshop

Приклад не показує різниці між 95 і 100. порівнюючи jpeg 95 і 100 з LR з шарами Photoshop

Це не просто показ двійкового "змінено чи ні", що робити, якщо ви хочете детальніше про те, наскільки це змінилося, скажімо, за кольоровим каналом?

  1. замініть пороговий шар коригування кривим регулювальним шаром.
  2. редагувати криву
  3. увімкніть показ відсікання
  4. візьміть вхідну білу ручку нижче правого нижнього кута і перетягніть її вліво, наскільки ви можете піти
  5. повільно рухайтеся назад праворуч, поки не побачите жодного відсікання (зображення попереднього перегляду все чорне)
  6. вимкніть відсікання і збережіть зміну кривої

Чим яскравіші пікселі, тим вони відрізняються тим кольором. Недоліком є ​​те, що ти закінчишся безліччю сірої бруду ... тому іноді простіше просто пороговувати, щоб побачити, де є відмінності. Ось чому я будую обидва і перемикаю, який з них видно.

Більш описовий погляд на різницю


Питання Ньюба, але як зробити крок 4, "створити шар ефекту вгорі"? Неможливо знайти його ніде. Це також через 7 років, і я використовую останню версію для перпіптів, вони також змінили ім'я?
Уїтніленд

14

Якщо ви використовуєте Photoshop, ось як би це зробити:

Помістіть два jpegs в один і той же файл psd, в два окремих шари. Вони повинні точно перекриватися, оскільки їх розміри однакові. (який з них зверху не має значення).

Встановіть для режиму змішування шару значення «Різниця». Ви побачили б переважно чорний результат. Залежить від різниці в якості між двома оригінальними шарами, які можуть бачити більше або менше шуму.

введіть тут опис зображення


Різниця сама по собі насправді не дуже допомагає, коли у вас залишилася така велика чорна порожнеча. :)
таксі

@cabbey впевнений, порівнюючи 100% до 95%, ви, швидше за все, отримаєте суцільний чорний. Але це те, що ваше питання задавало, чи не так? У відповіді власника ви змінюєте значення порівняних оригіналів, завдяки чому вони більше не мають початкових параметрів стиснення.
Джин

Ви отримуєте практично суцільний чорний колір майже на будь-якому порівнянні, оскільки відмінності настільки малі. Поріг / кривий шар після різниці нічого не робить із налаштуваннями стиснення, він просто сприяє візуалізації нижніх меж цього чорного супу, який готує різниця. (Я не на 100% впевнений, що ти мав на увазі під цим, тому я міг би рухатися в іншому напрямку…)
каббі

@cabbey, якщо ви просите провести чисто розрядну операцію щодо різниці між двома зображеннями, то лише режим змішування "Різниця" дає вам це. Коли ви регулюєте поріг / криву, результат є більш очевидним неозброєним оком, але це не точне зображення того, що змінилося. Коли ви це зробите, ви більше не порівнюєте 100% до 95%.
Джин

Впевнений, що ти є. Рівень стиснення перестав мати значення, коли другий фотошоп завантажив зображення з диска у його внутрішні буфери, тепер це нестиснений масив пікселів у пам'яті ... якщо ці пікселі потрапили через те, що на зображенні була квадратна крапка або тому, що вони є артефактом рівень стиснення не має значення.
каббі

13

Усі пакети обробки зображень повинні робити це просто. Я покажу вам, як це зробити в 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]

Графіка математики


Завжди добре бачити сценарій / автоматизований варіант! :)
jrista

5

Ви можете використовувати інструменти командного рядка Imagemagick.

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

забезпечить абсолютне значення відмінностей для кожного каналу RGB.



0
  1. Відкрийте одне із зображень у GIMP або Photoshop.
  2. Додайте друге зображення як новий шар поверх першого.
  3. Встановіть режим суміші верхнього шару на "Різниця"

На отриманому зображенні чорні частини показують, де оригінальні зображення однакові, а все світліше - відмінності.


Різниця сама по собі насправді не дуже допомагає, коли у вас залишилася така велика чорна порожнеча. :)
таксі

Ви завжди можете регулювати рівні на отриманому зображенні. Кожного разу, коли я використовував цю техніку, у мене були досить різні зображення, щоб можна було побачити зміни :)
День
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.