OpenCV / SURF Как создать хеш / отпечаток пальца / подпись изображения из дескрипторов?

Здесь есть несколько тем, которые очень помогают найти похожие картинки.

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

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

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

Обновить:

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

Деревья Словаря были бы выбором?

Я был бы очень благодарен за любую помощь.

4 ответа

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

void cvExtractSURF (const CvArr * image, const CvArr * mask, CvSeq ** keypoints, CvSeq ** descriptors, CvMemStorage * storage, CvSURFParams params)

Это 128 или 64 (в зависимости от параметров) векторов, которые содержат "отпечатки пальцев" конкретной функции (каждое изображение будет содержать переменное количество таких векторов). Если вы получаете последнюю версию Opencv, у них есть пример с именем find_obj.cpp, который показывает вам, как он используется для сопоставления

обновление:

Вы могли бы найти это обсуждение полезным

Тривиальный способ вычисления хеша будет следующим. Получить все дескрипторы из изображения (скажем, N из них). Каждый дескриптор представляет собой вектор из 128 чисел (вы можете преобразовать их в целые числа от 0 до 255). Итак, у вас есть набор из N*128 целых чисел. Просто запишите их один за другим в строку и используйте это как хеш-значение. Если вы хотите, чтобы хеш-значения были небольшими, я считаю, что есть способы вычислить хеш-функции строк, поэтому преобразуйте дескрипторы в строку, а затем используйте значение хеш-функции этой строки.

Это может сработать, если вы хотите найти точные дубликаты. Но кажется (поскольку вы говорите о масштабе, вращении и т. Д.), Вы просто хотите найти "похожие" изображения. В этом случае использование хеша, вероятно, не очень хороший способ. Вы, вероятно, используете какой-то детектор точек интереса, чтобы найти точки, в которых можно вычислить дескрипторы SURF. Представьте, что он вернет тот же набор точек, но в другом порядке. Внезапно ваше хеш-значение будет сильно отличаться, даже если изображения и дескрипторы одинаковы.

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

Кажется, что GIST может быть более подходящим для использования.

http://people.csail.mit.edu/torralba/code/spatialenvelope/ имеет код MATLAB.

Min-Hash или min -Hash - это метод, который может вам помочь. Он кодирует все изображение в виде с регулируемым размером, который затем сохраняется в хеш-таблицах. Существует несколько вариантов, таких как Geometric min- Hash, Partition min-Hash и Bundle min-Hashing. Получающийся в результате объем памяти не является одним из самых маленьких, но эти методы работают для множества сценариев, таких как почти дублирующийся поиск и даже поиск небольших объектов - сценарий, в котором другие короткие подписи часто работают не очень хорошо.

Есть несколько статей на эту тему. Начальная литература будет: Обнаружение дублированного изображения: min-Hash и tf-idf Взвешивание Ондрей Чум, Джеймс Филбин, Эндрю Циссерман, BMVC 2008 PDF

Другие вопросы по тегам