Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

Вы можете использовать чистый математический подход 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).

Ответ 5

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

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

Ответ 6

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

Ответ 7

Решение ruby ​​может быть найдено здесь

Из файла readme:

Phashion - это оболочка Ruby вокруг библиотеки pHash, "perceptual hash", которая обнаруживает дубликаты и близкие дубликаты мультимедийных файлов.

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

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