Как я могу получить разницу между двумя изображениями? У меня есть оригинальное изображение. Кто-то написал точную копию оригинального изображения. Теперь мне нужно сравнить оригинал с написанным на изображении и извлечь только текст в формате изображения.
Пример: у меня есть фотография дома. Кто-то взял копию и написал «Привет!» на копии. Я хочу как-то сравнить две картинки, снять дом и остаться с изображением слов «Привет!».
Это возможно с ImageMagick? Я знаю, что есть способы получить статистическую разницу между изображениями, но это не то, что я ищу.
image
image-processing
imagemagick
diff
difference
Джастин Ноэль
источник
источник
Ответы:
Мои собственные любимые эти два:
Единственная разница между двумя вышеуказанными командами: первая показывает визуальное различие между двумя изображениями в виде файла PNG, вторая - в формате PDF.
Результирующий файл diff отображает все пиксели, которые различаются красным цветом. Те, которые остаются неизменными, выглядят белыми.
Коротко и сладко.
Обратите внимание, что ваши изображения не обязательно должны быть одного типа. Вы даже можете смешивать JPEG, TIFF, PNG - при одном условии: изображения должны быть одинакового размера (размер изображения в пикселях). Выходной формат определяется расширением выходного имени файла.
Если по какой-то причине вам требуется более высокое разрешение, чем разрешение по умолчанию (72 dpi), просто добавьте соответствующий
-density
параметр:Иллюстрированные примеры
Вот несколько иллюстраций результатов для вариантов вышеуказанной команды. Примечание: два сравниваемых файла были даже файлами PDF , поэтому он работает и с ними (если они являются одностраничными)!
Слева: изображение с текстом. Центр: исходное изображение. Справа: различия (= текст) в красных пикселях.
Это та же команда, которую я предложил ранее выше.
Слева: изображение с текстом. Центр: исходное изображение. Справа: различия в «зеленых» пикселях.
Эта команда добавляет параметр, чтобы сделать пиксели разницы «seagreen» вместо красного по умолчанию.
Слева: изображение с текстом центра: Оригинал изображения Справа: Голубые дифференциалы (. Но ж определенный контекст фон) л
Эта команда удаляет
-compose src
деталь - результатом является поведение по умолчанию, вcompare
котором в качестве светлого фона сохраняется первое из двух рассеянных изображений. (На этот раз с добавленным параметром, чтобы пиксели diff отображались синим цветом.)источник
'compare'
. Для v7.x ImageMagick вы должны запустить'magick compare'
вместо этого.Несмотря на то,
compare
что он хорошо работает для многих приложений, я обнаружил, что иногда я предпочитаю другой подход, особенно при сравнении изображений, которые в основном представлены в оттенках серого:Идея заключается в следующем: конвертировать
file1.png
иfile2.png
в оттенки серого. Затем нарисуйте первый как красный канал полученного изображения, а второй как зеленый канал. Синий канал формируется из этих двух с использованиемdarken
оператора compose, что по сути означает получение минимума.Таким образом, вещи, которые белые на обоих изображениях, остаются белыми. Вещи, которые являются черными на обоих изображениях, остаются черными. Вещи, которые белые на первом изображении, но черные во втором становятся красными, а вещи, которые белые во втором, но черные в первом, становятся зелеными.
В результате вы получите изображение с цветовой кодировкой, в котором вы можете легко связать зеленый с первым входом и красный со вторым. Вот пример, в котором я использую это для сравнения вывода из LaTeX с выводом из KaTeX (прежде чем я исправил некоторую ошибку, чтобы сделать это лучше):
Вы можете комбинировать подходы, используя,
compare
чтобы увидеть, где что-то изменилось, а затем используя вышеизложенное, чтобы увидеть более подробно, как это изменилось.источник
-colorspace gray
вместо того, чтобы-grayscale Rec709Luminance
исправить это, но это портит композицию. Добавьте-respect-parentheses
в качестве первого варианта, чтобыconvert
позаботиться об этом.pdfdiff
каталоге и дополнительно печатает номера страниц, которые отличаются между двумя PDF-файлами.-grayscale
, не поддерживается, мне пришлось использовать,-colorspace gray
как предложено