Как я могу измерить сходство между двумя изображениями? [закрытый]
Я хотел бы сравнить скриншот одного приложения (может быть веб-страница) с ранее сделанным скриншотом, чтобы определить, правильно ли отображается приложение. Я не хочу точного сравнения соответствия, потому что аспект может быть немного другим (в случае веб-приложения, в зависимости от браузера, какой-то элемент может быть в немного другом месте). Это должно дать меру того, насколько похожи скриншоты.
есть ли библиотека / инструмент что уже делает это? Как бы вы это реализовали?
17 ответов:
Это полностью зависит от того, насколько умный вы хотите, чтобы алгоритм был.
например, вот некоторые вопросы:
- обрезанные изображения и необрезанное изображение!--6-->
- изображения с добавленным текстом против другого без
- зеркальные изображения
легкий и простой алгоритм я видел для этого просто сделать следующие шаги для каждого изображения:
- масштабирование до чего-то небольшого, например 64x64 или 32x32, игнорируйте соотношение сторон, используйте комбинирующий алгоритм масштабирования вместо ближайшего пикселя
- масштабируйте цветовые диапазоны так, чтобы самый темный был черным, а самый светлый-белым
- поверните и переверните изображение так, чтобы самый светлый цвет был слева вверху, а затем справа вверху-темнее, слева внизу-темнее (насколько это возможно, конечно)
Edit A объединяющий алгоритм масштабирования это тот, который при масштабировании 10 пикселей до одного это будет сделано с помощью функции, которая принимает цвет всех этих 10 пикселей и объединяет их в один. Это можно сделать с помощью таких алгоритмов, как усреднение, среднее значение или более сложные, такие как бикубические сплайны.
затем вычислите среднее расстояние пиксель за пикселем между двумя изображениями.
чтобы найти возможное совпадение в базе данных, сохраните цвета пикселей в виде отдельных столбцов в базе данных, проиндексируйте их кучу (но не все, если вы не используете очень маленькое изображение) и выполните запрос это использует диапазон для каждого значения пикселя, т. е. каждое изображение, где пиксель в маленькое изображение находится между -5 и +5 изображения, которое вы хотите посмотреть.
Это легко реализовать, и довольно быстро работать, но, конечно, не будет обрабатывать большинство продвинутых различий. Для этого вам нужны гораздо более продвинутые алгоритмы.
"классический" способ измерения заключается в том, чтобы разбить изображение на некоторое каноническое число секций (скажем, сетку 10x10), а затем вычислить гистограмму значений RGB внутри каждой ячейки и сравнить соответствующие гистограммы. Этот тип алгоритма предпочтителен как из-за его простоты, так и из-за его инвариантности к масштабированию и (маленький!) перевод.
используйте нормализованную цветовую гистограмму. (Читайте раздел о приложениях здесь), они обычно используются в системах поиска/сопоставления изображений и являются стандартным способом сопоставления изображений, который является очень надежным, относительно быстрым и очень простым в реализации.
по существу цветовая гистограмма будет захватывать цветовое распределение изображения. Затем это можно сравнить с другим изображением, чтобы увидеть, совпадают ли распределения цветов.
этот тип соответствия является довольно устойчив к масштабированию (как только гистограмма нормализуется) и вращению/сдвигу/движению и т. д.
избегайте попиксельных сравнений, как если бы изображение было слегка повернуто/сдвинуто, это может привести к большой разнице.
гистограммы было бы просто генерировать самостоятельно (предполагая, что вы можете получить доступ к значениям пикселей), но если вам это не нравится, то OpenCV библиотека является отличным ресурсом для выполнения такого рода вещей. здесь это презентация powerpoint, которая показывает вам, как создать гистограмму с помощью OpenCV.
вы могли бы использовать чисто математический подход
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).
разве алгоритмы кодирования видео, такие как MPEG, не вычисляют разницу между каждым кадром видео, чтобы они могли просто кодировать дельту? Вы можете посмотреть, как алгоритмы кодирования видео вычисляют эти различия кадров.
посмотрите на это приложение для поиска изображений с открытым исходным кодомhttp://www.semanticmetadata.net/lire/. он описывает несколько алгоритмов подобия изображений, три из которых относятся к стандарту MPEG-7: ScalableColor, ColorLayout, EdgeHistogram и Auto Color Коррелограмма.
вам понадобится распознавание образов для этого. Чтобы определить небольшие различия между двумя изображениями, Хопфилда сети работают довольно хорошо и довольно легко реализовать. Однако я не знаю никаких доступных реализаций.
рубиновое решение может быть найти здесь
из readme:
Phashion-это Рубиновая оболочка вокруг библиотеки pHash, "перцептивный хэш", который обнаруживает дубликаты и почти дубликаты мультимедийных файлов
Как измерить сходство между двумя изображениями полностью зависит от того, что вы хотели бы измерить, например: контраст, яркость, модальность, шум... а затем выбрать наиболее подходящую меру сходства есть для вас. Вы можете выбрать из MAD (имею в виду разницу absollute), MSD (средняя квадратная разница), которые хороши для измерения яркости...там si также доступны CR (коэффициент корреляции) который хорош в представлении кореляции между двумя изображениями. Вы также можете выбрать из гистограммы на основе мер сходства, таких как SDH (стандартное отклонение гистограммы разностного изображения) или многомодальные меры сходства, такие как MI (взаимная информация) или NMI (нормализованная взаимная информация).
поскольку эти меры сходства стоят много времени, рекомендуется масштабировать изображения до применения этих мер на них.
интересно (и я действительно просто бросаю идею там, чтобы быть сбитым), если что-то может быть получено путем вычитания одного изображения из другого, а затем сжатия полученного изображения в формате jpeg gif и взятия размера файла в качестве меры сходства.
Если бы у вас было два одинаковых изображения, вы бы получили белую коробку, которая сжималась бы очень хорошо. Чем больше различались образы, тем сложнее было бы их представлять, а значит, и тем меньше сжимаемый.
вероятно, не идеальный тест, и, вероятно, гораздо медленнее, чем необходимо, но он может работать как быстрая и грязная реализация.
вы можете посмотреть код для инструмента с открытым исходным кодом findimagedupes, хотя это, кажется, был написан на Perl, поэтому я не могу сказать, насколько легко будет разобрать...
читая страницу findimagedupes, которая мне понравилась, я вижу, что есть C++ реализация того же алгоритма. Предположительно, это будет легче понять.
и, похоже, вы также можете использовать gqview.
ну, чтобы не отвечать на ваш вопрос напрямую, но я видел, как это происходит. Microsoft недавно запустила инструмент под названием программа Photosynth который делает что-то очень похожее, чтобы определить перекрывающиеся области в большом количестве изображений (которые могут иметь разные пропорции).
интересно, есть ли у них какие-либо доступные библиотеки или фрагменты кода в их блоге.
чтобы расширить Примечание Вайбхава,Хугин является открытым исходным кодом 'autostitcher', который должен иметь некоторое представление о проблеме.
есть программное обеспечение для поиска изображений на основе контента, которое делает (частично) то, что вам нужно. Все ссылки и объяснения связаны с сайта проекта, а также есть короткий учебник (Kindle):LIRE
Ну действительно метод базового уровня для использования может пройти через каждый цвет пикселя и сравнить его с соответствующим цветом пикселя на втором изображении - но это, вероятно, очень очень медленное решение.
Если это то, что вы будете делать время от времени и не нуждается в автоматизации, вы можете сделать это в редакторе изображений, который поддерживает слои, такие как Photoshop или Paint Shop Pro (возможно, GIMP или Paint.Net тоже, но я не уверен в этом). Откройте оба снимка экрана и поместите один слой поверх другого. Измените режим смешивания слоев на Difference, и все, что одинаково между ними, станет черным. Вы можете перемещать верхний слой, чтобы свести к минимуму любое выравнивание различия.
вы можете использовать сиамскую сеть, чтобы увидеть, если два изображения похожи или отличаются после этого учебник. Этот учебник кластер аналогичные изображения, в то время как вы можете использовать
L2расстояние для измерения сходства двух изображений.
Beyond Compare имеет попиксельное сравнение изображений, например,

Comments