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

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

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

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

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

Update:

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

Можно ли использовать словарные деревья?

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

Ответ 1

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

void cvExtractSURF (const CvArr * image, const CvArr * mask, CvSeq ** keypoints, CvSeq ** дескрипторы, хранилище CvMemStorage *, параметры CvSURFParams)

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

Обновление

вы можете найти этот отзыв полезным

Ответ 2

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

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

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

Ответ 4

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

Есть несколько статей по этой теме. Вступительная литература будет: Рядом с обнаружением повторяющихся изображений: min-Hash и tf-idf Weighting Ондрей Чум, Джеймс Филбин, Эндрю Зиссерман, BMVC 2008 PDF