«Различить» изображение с помощью ImageMagick - PullRequest
155 голосов
/ 27 февраля 2011

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

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

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

Ответы [ 2 ]

296 голосов
/ 06 июля 2012

Мои любимые две:

 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-файлы , поэтому он работает и с ними (если они являются одностраничными)!


Слева: Изображение с текстом В центре: Исходное изображение Справа: Различия (= текст) в красных пикселях. 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 background л

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

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

47 голосов
/ 12 ноября 2015

Хотя 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 compose, что по сути означает получение минимума.

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

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

enter image description here

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

...