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

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

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

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

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

Обновление:

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

Могут ли быть доступными словарные деревья?

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

Ответы [ 4 ]

9 голосов
/ 27 января 2010

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

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

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

обновление

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

3 голосов
/ 30 января 2010

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

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

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

2 голосов
/ 11 июня 2013

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

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

2 голосов
/ 08 февраля 2010

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

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

...