it-roy-ru.com

«Различить» изображение с помощью ImageMagick

Как я могу получить разницу между двумя изображениями? У меня есть оригинальное изображение. Кто-то написал точную копию оригинального изображения. Теперь мне нужно сравнить оригинал с написанным на изображении и извлечь только текст в формате изображения.

Пример: у меня есть фотография дома. Кто-то взял копию и написал "Привет!" На копии. Я хочу как-то сравнить две картины, снять дом и остаться с изображением слов "Привет!".

Это возможно с ImageMagick? Я знаю, что есть способы получить статистическую разницу между изображениями, но это не то, что я ищу.

154
Justin Noel

Мои собственные любимые эти два:

 compare image1 image2 -compose src diff.png
 compare image1 image2 -compose src diff.pdf

Единственная разница между двумя вышеуказанными командами: первая показывает визуальное различие между двумя изображениями в виде файла PNG, вторая - в формате PDF.

Результирующий файл diff отображает все пиксели, которые различаются красным цветом. Те, которые остаются неизменными, выглядят белыми.

Коротко и сладко.

Обратите внимание, что ваши изображения должны не быть того же типа. Вы даже можете смешивать JPEG, TIFF, PNG - при одном условии: изображения должны быть одинакового размера (размер изображения в пикселях). Выходной формат определяется расширением выходного имени файла.

Если по какой-то причине вам требуется более высокое разрешение, чем разрешение по умолчанию (72 dpi), просто добавьте соответствующий параметр -density:

 compare -density 300 image1 image2 -compose src diff.jpeg

Иллюстрированные примеры

Вот несколько иллюстраций результатов для вариантов вышеуказанной команды. Примечание: два сравниваемых файла были четными PDF-файлы , поэтому он работает и с ними ( пока они 1-пейджеры)!


Слева: Изображение с текстом В центре: Исходное изображение Справа: Различия (= текст) в красных пикселях. Red difference pixels only; identical pixels are white

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf

Это та же команда, которую я предложил ранее выше.


Слева: Изображение с текстом В центре: Исходное изображение Справа: Различия в "зеленых" пикселях. Seagreen difference pixels only; identical pixels are white

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf

Эта команда добавляет параметр, чтобы сделать пиксели разницы "seagreen" вместо красного по умолчанию.


Слева: Изображение с текстом В центре: Исходное изображение Справа: Синие различия (но с некоторым контекстным фоном) Blue difference pixels only; first of the compared images as a lightened-up backgroundl

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf

Эта команда удаляет часть -compose src - результатом является поведение по умолчанию compare, которое сохраняет в качестве фона с подсветкой первое из 2 рассеянных изображений. (На этот раз с добавленным параметром, чтобы пиксели diff отображались синим цветом.)

293
Kurt Pfeifle

Хотя compare хорошо справляется со многими приложениями, я обнаружил, что иногда я предпочитаю другой подход, особенно при сравнении изображений, которые в основном имеют оттенки серого:

convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \
        '(' file2.png -flatten -grayscale Rec709Luminance ')' \
        '(' -clone 0-1 -compose darken -composite ')' \
        -channel RGB -combine diff.png

Идея заключается в следующем: преобразовать file1.png и file2.png в оттенки серого. Затем нарисуйте первый как красный канал полученного изображения, а второй как зеленый канал. Синий канал формируется из этих двух с использованием оператора компоновки darken, что по сути означает получение минимума.

Таким образом, вещи, которые белые на обоих изображениях, остаются белыми. Вещи, которые являются черными на обоих изображениях, остаются черными. Вещи, которые белые на первом изображении, но черные во втором становятся красными, а вещи, которые белые во втором, но черные в первом, становятся зелеными.

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

enter image description here

Вы можете объединить подходы, используя compare, чтобы увидеть где что-то изменилось, а затем, используя приведенное выше, посмотреть более подробно как это изменилось.

46
MvG