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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Из файла readme:

Phoma – это shell Ruby вокруг библиотеки pHash, «perceptual hash», которая обнаруживает дубликаты и близкие дубликаты мультимедийных файлов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Для чего нужен пузырь?
  • Алгоритм для выделения перекрывающихся прямоугольников?
  • Сгенерировать список всех возможных перестановок строки
  • Уравнение для тестирования, если точка находится внутри круга
  • Что такое самоуверенное программное обеспечение?
  • Является ли двойным действительно неподходящим для денег?
  • Болт-коллаж - обнаружение и обработка
  • Как определить тип кредитной карты на основе номера?
  • Как работает переопределение переменных XOR?
  • Как вы находите точку на заданном перпендикулярном расстоянии от линии?
  • Что такое инъекция зависимости?
  • Давайте будем гением компьютера.