Как я могу получить разницу между двумя изображениями? У меня есть исходное изображение. Кто-то написал точный дубликат исходного изображения. Теперь мне нужно сравнить оригинал с написанным на изображении и извлечь только текст в формате изображения.
Пример: у меня есть фотография дома. Кто-то взял копию и написал "Привет!". на копии. Я хочу как-то сравнить две картины, удалить дом и оставить изображение с надписью "Привет!".
Возможно ли это с помощью ImageMagick? Я знаю, что есть способы получить статистическую разницу между изображениями, но это не то, что я ищу.
Ответ 1
Моими избранными являются эти два:
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-пейджерами)!
Слева: Изображение с текстом Центр: Исходное изображение & strong > Вправо: Различия (= текст) в красных пикселях.
![Только красные разностные пиксели, идентичные пиксели белые]()
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-compose src \
diff-compose-default.pdf
Это та самая команда, которую я предложил ранее выше.
Слева: Изображение с текстом Центр: Исходное изображение Вправо: Различия в пикселях "seagreen".
![Только пиксели с сиреневым оттенком, идентичные пиксели белые]()
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-compose src \
-highlight-color seagreen \
diff-compose-default.pdf
Эта команда добавляет параметр, чтобы сделать разницу пикселей "seagreen" вместо красного по умолчанию.
Слева: Изображение с текстом Центр: Исходное изображение Вправо: Синий diff (но с некоторым контекстным фоном)
l
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-highlight-color blue \
diff-compose-default.pdf
Эта команда удаляет часть -compose src
- результатом является поведение по умолчанию compare
, которое сохраняет в качестве освещаемого фона первое из двух разнесенных изображений. (На этот раз с добавленным параметром, чтобы пиксели diff отображались синим цветом.)
Ответ 2
В то время как 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
в оттенки серого. Затем trat первый как красный канал результирующего изображения, второй - зеленый. Синий канал формируется из этих двух с помощью оператора darken
compose, что по существу означает принятие минимума.
Таким образом, белые изображения обоих изображений остаются белыми. Черные изображения обоих изображений остаются черными. Вещи, белые на первом изображении, но черные во втором красном цвете, а во втором - белые, а черные - зеленые.
Результат дает вам красивое цветовое изображение, в котором вы можете легко связать зеленый цвет с первым входом и красным со вторым. Вот пример, где я использую это, чтобы сравнить результат из LaTeX с тем, что из KaTeX (до того как я исправлена некоторая ошибка, чтобы сделать это лучше):
![enter image description here]()
Вы можете комбинировать подходы, используя compare
, чтобы увидеть, где что-то изменилось, а затем использовать выше, чтобы более подробно посмотреть, как это изменилось.