Вопрос:

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

algorithm language-agnostic image image-processing

83378 просмотра

17 ответа

6831 Репутация автора

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

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

Автор: Antoine Aubry Источник Размещён: 25.08.2008 12:51

Ответы (17)


2 плюса

8757 Репутация автора

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

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

Автор: Vaibhav Размещён: 25.08.2008 12:57

8 плюса

398959 Репутация автора

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

Автор: Konrad Rudolph Размещён: 25.08.2008 01:00

4 плюса

67467 Репутация автора

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

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

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

Автор: Matt Sheppard Размещён: 25.08.2008 01:04

3 плюса

78949 Репутация автора

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

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

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

Автор: dmckee Размещён: 25.08.2008 01:09

2 плюса

9358 Репутация автора

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

Автор: hometoast Размещён: 25.08.2008 01:16

0 плюса

29425 Репутация автора

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

Автор: Ross Размещён: 25.08.2008 01:19

64 плюса

290939 Репутация автора

Решение

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

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

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

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

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

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

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

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

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

Автор: Lasse Vågsæther Karlsen Размещён: 25.08.2008 01:53

30 плюса

11125 Репутация автора

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

Автор: Louis Brandy Размещён: 25.08.2008 07:18

24 плюса

22745 Репутация автора

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

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

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

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

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

Автор: Lehane Размещён: 27.08.2008 04:41

13 плюса

102194 Репутация автора

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

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

Автор: Mark B Размещён: 16.09.2008 08:29

0 плюса

224684 Репутация автора

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

Автор: Mark Ransom Размещён: 15.10.2008 03:15

13 плюса

131 Репутация автора

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

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

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

Автор: Shachar Размещён: 23.07.2011 02:55

6 плюса

1057 Репутация автора

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

Из readme:

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

Автор: edk750 Размещён: 22.09.2011 08:51

2 плюса

304 Репутация автора

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

Автор: Mathias Размещён: 19.04.2013 02:51

5 плюса

63 Репутация автора

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

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

Автор: Gregor Simončič Размещён: 31.01.2016 10:41

0 плюса

71 Репутация автора

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

Автор: cpwah Размещён: 27.02.2017 08:53

0 плюса

1049 Репутация автора

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

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

Автор: emallove Размещён: 26.04.2017 07:57
Вопросы из категории :
32x32