Как я могу точно сказать, что изменилось между двумя изображениями? - Фотопедия
27 голосов
/ 06 мая 2011

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

Как создать хорошие визуальные карты того, что изменилось без утомительного программирования на заказ?

Ответы [ 6 ]

35 голосов
/ 06 мая 2011

Photoshop + Слои FTW. (Да, вы также можете использовать Gimp или любое другое программное обеспечение для редактирования с такими же функциями.)

Начните с базового изображения, в приведенном выше случае я использовал изображение в формате jpeg quality 100.

  1. создайте новый слой поверх него
  2. вставьте второе изображение в этот слой
  3. установить стиль слоя на "разность" (см. Розовую стрелку влево на первом изображении ниже)
  4. поверх этого слоя создается эффект (Слой> Новый корректирующий слой> Порог)
  5. установить эффект на порог (см. Правую розовую стрелку на первом изображении ниже)
  6. установить пороговое значение на 1

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

Пример, показывающий много различий между jpeg 92 и 100 от Lightroom. comparing jpeg 92 and 100 from LR with Photoshop layers

Пример, не показывающий разницы между 95 и 100. comparing jpeg 95 and 100 from LR with Photoshop layers

Не просто показывает, что двоичный файл "изменен или нет", а что, если вы хотите узнать больше о том, насколько он изменился, скажем, по цветному каналу?

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

Чем ярче получаемые пиксели, тем больше они отличаются по цвету. Недостатком является то, что вы в конечном итоге получаете много серой грязи ... поэтому иногда проще просто ограничить ее, чтобы увидеть различия. Вот почему я создаю оба и переключаю, какой из них видим.

more descriptive view of the difference

14 голосов
/ 06 мая 2011

Если вы используете Photoshop, вот как я это сделаю:

Поместите два файла JPEG в один и тот же файл PSD, в два отдельных слоя. Они должны точно совпадать, поскольку их размеры одинаковы. (который идет сверху не имеет значения).

Установите режим наложения слоя на «Разница». Вы увидите в основном черный результат. В зависимости от разницы в качестве между двумя исходными слоями вы можете увидеть больше или меньше шума.

enter image description here

13 голосов
/ 08 августа 2012

Все пакеты обработки изображений должны сделать это легко. Я покажу вам, как это сделать в Mathematica, если у вас есть доступ к этой системе. Mathematica - это язык программирования, но манипуляции такого рода очень просты, поэтому, если у вас есть доступ к нему (например, через лицензию университетского сайта), я рекомендую вам попробовать!

Сначала импортируйте изображение:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

Перепрессуйте его, используя сжатие JPEG

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Mathematica graphics

Теперь возьмем разницу значений пикселей, сначала преобразовав их в числа с плавающей точкой, чтобы гарантировать сохранение отрицательных значений.

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Mathematica graphics

На разностном изображении мало что видно (разница крошечная), а отрицательные значения обрезаются до черного. Итак, давайте изменим масштаб всех значений, чтобы заполнить весь динамический диапазон (минимум будет масштабироваться до 0, максимум до 1):

ImageAdjust[diff]

Mathematica graphics

ImageDifference дает абсолютную разницу двух изображений и не дает отрицательных чисел. Эту операцию вы, скорее всего, найдете в пакетах обработки изображений, особенно в графических интерфейсах (Photoshop, GIMP).

ImageDifference[img, img2]

Mathematica graphics

Мы также можем взять один канал RGB, например, красный, и визуализировать положительные и отрицательные различия, используя «противоположные» цвета:

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Mathematica graphics

Вот то же самое, с усилением различий в 5 раз. Артефакты JPEG теперь более узнаваемы.

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Mathematica graphics

Преимущество использования языка программирования состоит в том, что мы можем легко автоматизировать это и увидеть, как изменяется разница для «уровней сжатия» между 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]

Mathematica graphics

5 голосов
/ 02 марта 2018

Вы можете использовать инструменты командной строки Imagemagick.

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

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

1 голос
/ 06 мая 2011

GitHub имеет несколько интересных инструментов различий в изображениях, встроенных в него в Интернете, , как описано здесь и , продемонстрированных в этой демонстрации .

0 голосов
/ 06 мая 2011
  1. Откройте одно из изображений в GIMP или Photoshop.
  2. Добавьте второе изображение в качестве нового слоя поверх первого.
  3. Установите режим смешивания верхнего слоя на «Разница»

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

...