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

StackOverflow https://stackoverflow.com/questions/25977

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Из ридми:

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

Как измерить сходство между двумя изображениями, полностью зависит от того, что вы хотите измерить, например:контраст, яркость, модальность, шум...а затем выберите наиболее подходящую для вас меру сходства.Вы можете выбрать из БЕЗУМНЫЙ (средняя абсолютная разница), МСД (среднеквадратическая разность), которые хороши для измерения яркости...также доступны ЧР (коэффициент корреляции), который хорошо отражает корреляцию между двумя изображениями.Вы также можете выбрать одну из мер сходства на основе гистограммы, например СДХ (стандартное отклонение гистограммы разностных изображений) или меры мультимодального сходства, такие как МИ (взаимная информация) или НМИ (нормализованная взаимная информация).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top