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

28

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

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

cabbey
источник
2
Не отправлять это как ответ, поскольку это, вероятно, не является жизнеспособным решением для фотографий, но GitHub (сайт программиста) имеет несколько интересных способов сравнения изображений: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Попробуйте нажать «2-вверх», «Размах», «Луковая кожура» и «Разница».
Хенрик N

Ответы:

35

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

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

  1. создайте новый слой поверх него
  2. вставьте второе изображение в этот слой
  3. установите стиль слоя на «разность» (см. левую розовую стрелку на первом изображении ниже)
  4. создайте слой эффекта поверх этого (Layer> New Adjustment Layer> Threshold)
  5. установите эффект на порог (см. правую розовую стрелку на первом изображении ниже)
  6. установите пороговое значение на 1

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

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

Пример, не показывающий никакой разницы между 95 и 100. сравнивая jpeg 95 и 100 из LR со слоями Photoshop

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

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

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

более описательный взгляд на разницу

cabbey
источник
Новый вопрос, но как сделать шаг 4, «создать слой эффекта поверх этого»? Не могу найти это нигде. Это также 7 лет спустя, и я использую последнюю версию для perrhaps, они также изменили название?
Уитниленд
14

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

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

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

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

Jin
источник
Разница сама по себе не очень помогает, когда вы остаетесь с такой большой черной пустотой. :)
извозчик
@ 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]

Математическая графика

Сабольч
источник
Всегда приятно видеть сценарий / автоматизированный вариант! :)
Йриста
5

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

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

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

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

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

Дэн
источник
Разница сама по себе не очень помогает, когда вы остаетесь с такой большой черной пустотой. :)
извозчик
Вы всегда можете настроить уровни на полученном изображении. Всякий раз, когда я использовал эту технику, у меня были изображения, достаточно разные, чтобы увидеть изменения :)
Дан