OpenCV / ПЕРЕМЕЩЕНИЕ, Как генерировать хеш изображения / цифровой отпечаток / подпись из дескрипторов?

Существуют некоторые темы здесь, которые очень полезны о том, как найти подобные изображения.

То, что я хочу сделать, должно получить цифровой отпечаток изображения и найти то же изображение на различных фотографиях взятым цифровым фотоаппаратом. Швы алгоритма ПЕРЕМЕЩЕНИЯ, чтобы быть лучшим способом быть независимыми на масштабировании, удите рыбу и другие искажения.

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

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

Обновление:

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

Деревья Словаря были бы опцией?

Я был бы очень благодарен за любую справку.

37
задан Wooble 3 September 2013 в 12:13
поделиться

3 ответа

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

Void CVEXTRACTSURF (Const Cvarr * изображение, const cvarr * mask, cvseq ** keypoints, cvseq ** дескрипторы, cvmemstorage * хранение, cvsurfparams )

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

обновления :

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

Несомненно
9
ответ дан 27 November 2019 в 05:04
поделиться

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

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

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

3
ответ дан 27 November 2019 в 05:04
поделиться

Похоже, что ГИСТ может быть более подходящей вещью для использования.

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

2
ответ дан 27 November 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: