Я предполагаю, что вы пытаетесь использовать SIFT для извлечения изображений, поскольку вы упомянули, что у вас есть база данных изображений, с которой вы сравниваете изображение запроса.
Вы должны понимать, что при сравнении каждого вектора дескриптора SIFT взапросить изображение со всеми другими векторами дескрипторов в базе данных изображений невозможно, так как для этого потребуется экспоненциальное число сравнений.В настоящее время популярным подходом к извлечению изображений с использованием дескрипторов SIFT является модель слов, заимствованная из документов.
Во-первых, то, что вы хотите сделать, - это изображение, представьте его с помощью ОДНОГО вектора, который можно сравнитьк векторам других изображений в базе данных.Это не похоже на ваш текущий подход, когда каждое изображение имеет много векторов дескриптора SIFT (по одному для каждой ключевой точки).В модели пакета слов (BOW) сначала необходимо создать то, что называется визуальной кодовой книгой (или иногда ее называют словарем).Вы делаете это следующим образом:
- Выбор репрезентативных изображений из вашей базы данных изображений
- Соберите все дескрипторы SIFT из изображений в 1)
- Сгруппируйте эти дескрипторы, используя K Meansв число k кластеров, где k это число, которое вы установили.Центром этих кластеров являются «визуальные слова», то есть репрезентативные элементы в вашей базе данных изображений.
Для каждого изображения в базе данных вы собираетесь создать вектор v
, который подсчитывает, как частоВ словаре присутствуют различные элементы, поэтому каждое изображение будет представлено вектором в виде: <# times feature 1 in dictionary occur, ... feature 2 in dictionary occur..., ..., ... feature k in dictionary occur>
, т. е. акмерного вектора.Вы получаете этот вектор для изображения:
4.1.Извлечение SIFT дескрипторов в изображение
4.2.Для каждого дескриптора SIFT в изображении найдите ближайший центр кластера (используя евклидово расстояние) в кодовой книге / словаре и увеличьте его соответствующий счетчик в векторе v
на 1.
Например, у вас есть 5 кластеровсловарь (например, k = 5), и изображение имеет 3 дескриптора SIFT.2 из них находятся ближе всего к первому кластерному центру, а 1 - ближе к пятому кластерному центру.Ваш вектор v
будет v = <2, 0, 0, 0, 1>
.Поскольку v
подсчитывает количество встречающихся векторов на изображении, v
иногда также называют частотной гистограммой.
На этом этапе вы можете захотеть нормализовать гистограмму путем деления каждогозапись по сумме всех записей, чтобы можно было сравнивать изображения с очень различным числом найденных точек SIFT.
Теперь, чтобы сравнить 2 изображения, вы сравниваете этот новый вектор v
вместо самих дескрипторов SIFT.Сравнение может быть сделано с использованием евклидова расстояния (также известного как расстояние L2).Было обнаружено, что использование расстояния Хи-квадрат или Хеллингера может улучшить результаты.Смотрите подробности, описанные на этой странице .
По сути, сравнение самих дескрипторов SIFT в изображении с дескрипторами другого невозможно, потому что в результате вы получите несколько дескрипторов SIFT в изображении, и их количество зависит от способа извлеченияих.
То, что вы хотите, является общей основой для сравнения, и это делается в модели BOW путем сопоставления дескрипторов с общей кодовой книгой / словарем, который учитывает характерные особенности в базе данных изображений.