Как я могу измерить сходство между двумя изображениями? [закрыто]

95

Я хотел бы сравнить снимок экрана одного приложения (может быть веб-страницей) с ранее сделанным снимком экрана, чтобы определить, правильно ли отображается приложение. Мне не нужно точное сравнение совпадений, потому что аспект может немного отличаться (в случае веб-приложения, в зависимости от браузера, некоторые элементы могут находиться в немного другом месте). Это должно дать представление о том, насколько похожи скриншоты.

Есть ли библиотека / инструмент, который это уже делает? Как бы вы это реализовали?

Антуан Обри
источник
1
На этот похожий вопрос есть несколько хороших ответов: stackoverflow.com/questions/75891/…
blak
1
И еще здесь: stackoverflow.com/questions/189943/…
Anoyz 09
1
Пришло время обновить ответы в свете последних достижений в области машинного обучения и, в частности, «глубокого обучения».
jldupont
Моей лаборатории тоже нужно было решить эту проблему, и я использовал рабочий процесс, описанный здесь: douglasduhaime.com/posts/…
Duhaime

Ответы:

75

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

Например, вот некоторые проблемы:

  • обрезанные изображения по сравнению с необрезанным изображением
  • изображения с добавленным текстом по сравнению с другим без
  • зеркальные изображения

Самый простой и простой алгоритм, который я видел, - это просто проделать следующие шаги с каждым изображением:

  1. масштабировать до чего-то небольшого, например 64x64 или 32x32, игнорировать соотношение сторон, использовать алгоритм комбинирования масштабирования вместо ближайшего пикселя
  2. масштабируйте диапазон цветов так, чтобы самый темный был черным, а самый светлый - белым
  3. повернуть и отразить изображение так, чтобы самый светлый цвет находился в верхнем левом углу, затем верхний правый цвет был следующим темнее, нижний левый - следующим темнее (конечно, насколько это возможно)

Редактировать алгоритм комбинирования масштабирования является один , что при масштабировании 10 пикселей вниз на один будет делать это с помощью функции , которая принимает цвет всех этих 10 пикселей и объединяет их в одно целое. Может быть выполнено с помощью таких алгоритмов, как усреднение, среднее значение или более сложных, таких как бикубические сплайны.

Затем вычислите среднее расстояние пиксель за пикселем между двумя изображениями.

Чтобы найти возможное совпадение в базе данных, сохраните цвета пикселей в виде отдельных столбцов в базе данных, проиндексируйте их группу (но не все, если вы не используете очень маленькое изображение) и выполните запрос, который использует диапазон для каждого значение пикселя, т.е. каждое изображение, где пиксель в маленьком изображении находится между -5 и +5 изображения, которое вы хотите найти.

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

Лассе В. Карлсен
источник
14
Что такое «комбинирующий алгоритм масштабирования»?
Грегг Линд,
32

«Классический» способ измерения этого - разбить изображение на некоторое каноническое количество секций (скажем, сетку 10x10), а затем вычислить гистограмму значений RGB внутри каждой ячейки и сравнить соответствующие гистограммы. Этот тип алгоритма предпочтителен как из-за его простоты, так и из-за его инвариантности к масштабированию и (небольшому!) Преобразованию.

Луи Бренди
источник
6
Разве это не похоже на создание одной гистограммы для всего изображения, но с дополнительными недостатками, заключающимися в отсутствии устойчивости к зеркальному отражению и повороту?
dodgy_coder
2 гистограммы из 2 половин изображения будут иметь лучшую точность совпадения, чем 1 гистограмма целого. Хотя у него есть упомянутые вами недостатки, это зависит от того, какую проблему вы решаете.
psycho brm
25

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

По сути, цветовая гистограмма фиксирует цветовое распределение изображения. Затем это можно сравнить с другим изображением, чтобы увидеть, совпадают ли распределения цветов.

Этот тип сопоставления довольно устойчив к масштабированию (после нормализации гистограммы), вращению / смещению / перемещению и т. Д.

Избегайте попиксельных сравнений, так как если изображение немного повернуто / сдвинуто, это может привести к большой разнице.

Гистограммы было бы легко сгенерировать самостоятельно (при условии, что вы можете получить доступ к значениям пикселей), но если вам это не нравится, библиотека OpenCV - отличный ресурс для выполнения такого рода вещей. Вот презентация в PowerPoint, в которой показано, как создать гистограмму с помощью OpenCV.

Lehane
источник
14

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

Взгляните на это приложение для поиска изображений с открытым исходным кодом http://www.semanticmetadata.net/lire/ . Он описывает несколько алгоритмов подобия изображений, три из которых относятся к стандарту MPEG-7: ScalableColor, ColorLayout, EdgeHistogram и Auto Color Correlogram.

Марк Б
источник
1
Это не ответит на вопрос здесь. Вопрос не в сравнении пикселей на пиксель.
Kousha
@Kousha Верно, но все же интересное направление для размышлений.
значения-вопросы
13

Вы можете использовать чисто математический подход O(n^2), но он будет полезен, только если вы уверены, что нет смещения или чего-то в этом роде. (Хотя, если у вас есть несколько объектов с однородной окраской, это все равно будет работать очень хорошо.)

В любом случае, идея состоит в том, чтобы вычислить нормализованное скалярное произведение двух матриц. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

Эта формула на самом деле является «косинусом» угла между матрицами (wierd). Чем больше сходство (скажем Pij=Qij), C будет 1, и если они полностью разные, скажем, для каждого i,j Qij = 1(избегая деления на ноль) Pij = 255, то для размера nxn, чем больше nбудет, тем ближе к нулю мы получить. (По приблизительным подсчетам :) C=1/n^2.

Шахар
источник
8

Для этого вам понадобится распознавание образов . Чтобы определить небольшие различия между двумя изображениями, сети Хопфилда работают достаточно хорошо и их довольно легко реализовать. Однако я не знаю каких-либо доступных реализаций.

Конрад Рудольф
источник
7

Рубиновый раствор можно найти здесь

Из ридми:

Phashion - это оболочка Ruby вокруг библиотеки pHash, «перцептивного хеша», которая обнаруживает повторяющиеся и почти повторяющиеся мультимедийные файлы.

edk750
источник
5

Как измерить сходство между двумя изображениями полностью зависит от того, что вы хотите измерить, например: контраст, яркость, модальность, шум ... а затем выбрать наиболее подходящий для вас показатель сходства. Вы можете выбрать MAD (средняя абсолютная разница), MSD (среднеквадратичная разница), которые подходят для измерения яркости ... также доступен CR (коэффициент корреляции), который хорошо отображает корреляцию между двумя изображениями. Вы также можете выбрать меры сходства на основе гистограммы, такие как SDH (стандартное отклонение гистограммы разностного изображения), или меры сходства по многомодальности, такие как MI (взаимная информация) или NMI (нормализованная взаимная информация).

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

Грегор Симончич
источник
4

Мне интересно (и я действительно просто предлагаю идею, чтобы ее сбили), можно ли что-то получить, вычитая одно изображение из другого, а затем сжимая полученное изображение как jpeg или gif и принимая размер файла как мера сходства.

Если бы у вас было два одинаковых изображения, вы бы получили белое поле, которое хорошо сжималось бы. Чем больше различались изображения, тем сложнее их было бы представить и, следовательно, тем менее сжимаемыми.

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

Мэтт Шеппард
источник
Подумайте о повороте на 90 градусов; изображения по-прежнему похожи.
значения-вопросы
3

Вы можете посмотреть код инструмента с открытым исходным кодом findimagedupes , хотя он, похоже, был написан на perl, поэтому я не могу сказать, насколько легко будет его разобрать ...

Читая страницу findimagedupes, которая мне понравилась, я вижу, что существует реализация того же алгоритма на C ++ . По-видимому, это будет легче понять.

И, похоже, вы также можете использовать gqview .

dmckee --- котенок экс-модератора
источник
2

Ну, чтобы не отвечать прямо на ваш вопрос, но я видел, как это происходило. Microsoft недавно запустила инструмент под названием PhotoSynth. который делает нечто очень похожее для определения перекрывающихся областей на большом количестве изображений (которые могут иметь разное соотношение сторон).

Интересно, есть ли у них в блоге какие-либо доступные библиотеки или фрагменты кода.

Вайбхав
источник
1
Этот тек. было прекращено.
Джозеф Россон
2

Чтобы расширить заметку Вайбхава, hugin - это «автошивчик» с открытым исходным кодом, который должен иметь некоторое представление о проблеме.

домашний тост
источник
2

Есть программное обеспечение для поиска изображений на основе содержимого, которое (частично) делает то, что вам нужно. Все ссылки и пояснения связаны с сайтом проекта, а также есть краткое учебное пособие (Kindle): LIRE

Матиас
источник
1

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

cpwah
источник
0

Если это то, что вы будете делать время от времени и не нуждаетесь в автоматизации, вы можете сделать это в редакторе изображений, который поддерживает слои, таком как Photoshop или Paint Shop Pro (возможно, GIMP или Paint.Net тоже, но я '' м не уверен насчет них). Откройте оба снимка экрана и поместите один поверх другого. Измените режим наложения слоя на «Разница», и все, что между ними одинаково, станет черным. Вы можете перемещать верхний слой, чтобы минимизировать любые различия в выравнивании.

Марк Рэнсом
источник
Еще один инструмент, который делает этот тип различения очень простым - kaleidoscopeapp.com
Майкл Ософски
0

В Beyond Compare есть попиксельное сравнение изображений, например,

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

Emallove
источник
@xilpex, ОП спрашивает: есть ли библиотека / инструмент, который уже делает это ? В моем ответе есть ссылка на такую ​​библиотеку / инструмент.
emallove
-1

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

Росс
источник