Мне нужен простой и быстрый способ сравнить два изображения на сходство. Т.е. я хочу получить высокое значение, если они содержат одно и то же, но могут иметь немного другой фон и могут быть перемещены / изменены на несколько пикселей.
(Более конкретно, если это имеет значение: одно изображение - это значок, а другое изображение - это часть снимка экрана, и я хочу знать, является ли эта часть в точности значком или нет.)
У меня есть OpenCV, но я все еще не привык к нему.
Одна возможность, о которой я думал до сих пор: разделите оба изображения на 10x10 ячеек и для каждой из этих 100 ячеек сравните цветную гистограмму. Затем я могу установить некоторое придуманное пороговое значение, и если полученное мной значение выше этого порога, я предполагаю, что они похожи.
Я еще не пробовал, насколько хорошо это работает, но думаю, было бы достаточно. Изображения уже очень похожи (в моем случае использования), поэтому я могу использовать довольно высокое пороговое значение.
Я предполагаю, что есть десятки других возможных решений для этого, которые будут работать более или менее (поскольку сама задача довольно проста, поскольку я хочу только обнаружить сходство, если они действительно очень похожи). Что ты предлагаешь?
Есть несколько очень связанных / похожих вопросов о получении подписи / отпечатка пальца / хэша из изображения:
- OpenCV / SURF Как сгенерировать хэш изображения / отпечаток пальца / подпись из дескрипторов?
- Отпечаток изображения для сравнения сходства многих изображений
- Обнаружение почти повторяющихся изображений
- OpenCV: изображение отпечатка пальца и сравнение с базой данных .
- еще , еще , еще , еще , еще , еще , еще
Кроме того, я наткнулся на эти реализации, которые имеют такие функции для получения отпечатка пальца:
- pHash
- imgSeek ( репозиторий GitHub ) (GPL) на основе статьи Fast Multiresolution Image Querying
- изображение-соответствие . Очень похоже на то, что я искал. Подобно pHash, основанному на подписи изображения для любого изображения, Goldberg et al . Использует Python и Elasticsearch.
- iqdb
- ImageHash . поддерживает pHash.
- Дедупликатор изображений (imagededup) . Поддерживает CNN, PHash, DHash, WHash, AHash.
Некоторые дискуссии о перцептивных хэшах изображений: здесь
Немного оффтоп: существует множество методов для создания аудио отпечатков пальцев. MusicBrainz , веб-сервис, который обеспечивает поиск песен по отпечаткам пальцев, имеет хороший обзор в своей вики . Сейчас они используют AcoustID . Это для поиска точных (или наиболее точных) совпадений. Чтобы найти похожие совпадения (или если у вас есть только несколько фрагментов или много шума), взгляните на Echoprint . Связанный вопрос SO здесь . Похоже, это решено для аудио. Все эти решения работают неплохо.
Несколько более общий вопрос о нечетком поиске в целом здесь . Например, есть хеширование с учетом местоположения и поиск ближайшего соседа .
Ответы:
Можно ли преобразовать снимок экрана или значок (масштабировать, повернуть, наклонить ...)? У меня в голове довольно много методов, которые могли бы вам помочь:
Большинство из них уже реализовано в OpenCV - см., Например, метод cvMatchTemplate (использует сопоставление гистограмм): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html . Также доступны детекторы выдающихся точек / областей - см. Обнаружение функций OpenCV .
источник
В последнее время я сталкиваюсь с теми же проблемами, чтобы решить эту проблему (простой и быстрый алгоритм для сравнения двух изображений) раз и навсегда, я добавляю модуль img_hash в opencv_contrib, вы можете найти подробности по этой ссылке .
Модуль img_hash предоставляет шесть алгоритмов хеширования изображений, которые довольно просты в использовании.
Пример кодов
происхождение Лена
размытие лена
изменить размер Лены
сдвиг Лена
В этом случае ColorMomentHash дает лучший результат
Плюсы и минусы каждого алгоритма
Производительность img_hash тоже хорошая
Сравнение скорости с библиотекой PHash (100 изображений из ukbench)
Если вы хотите узнать рекомендуемые пороговые значения для этих алгоритмов, проверьте этот пост ( http://qtandopencv.blogspot.my/2016/06/introduction-to-image-hash-module-of.html ). Если вам интересно, как мне измерить производительность модулей img_hash (включая скорость и различные атаки), проверьте эту ссылку ( http://qtandopencv.blogspot.my/2016/06/speed-up-image-hashing-of -opencvimghash.html ).
источник
На скриншоте есть только значок? Если это так, то может хватить расстояния L2 между двумя изображениями. Если расстояние L2 не работает, следующий шаг - попробовать что-нибудь простое и хорошо известное, например: Лукас-Канаде . Я уверен, что это доступно в OpenCV.
источник
Если вы хотите получить индекс схожести двух изображений, я предлагаю вам по метрикам индекс SSIM. Это больше соответствует человеческому глазу. Вот статья об этом: Индекс структурного сходства
Он также реализован в OpenCV и может быть ускорен с помощью графического процессора: OpenCV SSIM с графическим процессором
источник
Если вы можете быть уверены, что ваш шаблон (значок) точно совмещен с областью тестирования, то подойдет любая старая сумма разницы пикселей.
Если выравнивание будет только крошечным, то вы можете пропустить оба изображения с помощью cv :: GaussianBlur, прежде чем найти сумму разностей пикселей.
Если качество выравнивания потенциально низкое, я бы порекомендовал либо гистограмму ориентированных градиентов, либо один из удобных алгоритмов обнаружения / дескриптора ключевых точек (например, SIFT или SURF ) OpenCV .
источник
Если для сопоставления одинаковых изображений - код для расстояния L2
Быстро. Но не устойчив к изменениям освещения / точки обзора и т. Д. Источник
источник
Если вы хотите сравнить изображения на сходство, я предлагаю вам использовать OpenCV. В OpenCV есть несколько функций сопоставления и сопоставления шаблонов. Для сопоставления функций существуют детекторы SURF, SIFT, FAST и т. Д. Вы можете использовать это для обнаружения, описания и сопоставления изображения. После этого вы можете использовать определенный индекс, чтобы найти количество совпадений между двумя изображениями.
источник