Как использовать алгоритм SIFT для вычисления сходства двух изображений?
я использовал просеять реализация Андреа Vedaldi, чтобы вычислить дескрипторы просеивания двух похожих изображений (второе изображение на самом деле является увеличенным изображением одного и того же объекта с другого угла).
теперь я не могу понять как сравнить дескрипторы, чтобы сказать, насколько похожи изображения?
Я знаю, что этот вопрос не отвечает, Если у вас нет на самом деле играл с такими вещами раньше, но я думал, что кто-то, кто делал это раньше, может знать это, поэтому я отправил вопрос.
то немногое, что я сделал для создания дескрипторов:
>> i=imread('p1.jpg');
>> j=imread('p2.jpg');
>> i=rgb2gray(i);
>> j=rgb2gray(j);
>> [a, b]=sift(i); % a has the frames and b has the descriptors
>> [c, d]=sift(j);
5 ответов
во-первых, разве вы не должны использовать vl_sift вместо sift?
во-вторых, вы можете использовать функцию SIFT matching для поиска соответствий в двух изображениях. Вот пример кода:
I = imread('p1.jpg');
J = imread('p2.jpg');
I = single(rgb2gray(I)); % Conversion to single is recommended
J = single(rgb2gray(J)); % in the documentation
[F1 D1] = vl_sift(I);
[F2 D2] = vl_sift(J);
% Where 1.5 = ratio between euclidean distance of NN2/NN1
[matches score] = vl_ubcmatch(D1,D2,1.5);
subplot(1,2,1);
imshow(uint8(I));
hold on;
plot(F1(1,matches(1,:)),F1(2,matches(1,:)),'b*');
subplot(1,2,2);
imshow(uint8(J));
hold on;
plot(F2(1,matches(2,:)),F2(2,matches(2,:)),'r*');
vl_ubcmatch () по существу делает следующее:
Предположим, у вас есть точка P в F1, и вы хотите найти "лучшее" совпадение в F2. Один из способов сделать это-сравнить дескриптор P в F1 со всеми дескрипторами в D2. По сравнению, Я имею в виду найти Евклидова расстояние (или L2-норма разности двух дескрипторов).
затем я нахожу две точки в F2, скажем U & V, которые имеют наименьшее и второе наименьшее расстояние (скажем, Du и Dv) от P соответственно.
вот что рекомендовал Лоу: если Dv / Du >= threshold (я использовал 1.5 в примере кода), то это соответствие приемлемо; в противном случае оно неоднозначно сопоставлено и отклоняется как соответствие, и мы не сопоставляем любую точку в F2 с P. По существу, если есть большой разница между лучшими и вторыми лучшими матчами, вы можете ожидать, что это будет качественный матч.
это важно, так как в изображении есть много возможностей для неоднозначных совпадений: представьте себе совпадающие точки в озере или здании с несколькими окнами, дескрипторы могут выглядеть очень похожими, но соответствие явно неверно.
вы можете сделать соответствие любым количеством способов .. вы можете сделать это очень легко с MATLAB или вы можете ускорить его с помощью KD-дерево или приблизительный поиск ближайшего числа, как ФЛАННА, который был реализован в OpenCV.
EDIT: кроме того, есть несколько реализации KD-tree в MATLAB.
вы должны прочитать Дэвида Лоу статьи, который говорит о том, как именно это сделать. Этого должно быть достаточно, если вы хотите сравнить изображения одного и того же объекта. Если вы хотите сопоставить изображения различных объектов одной и той же категории (например, автомобилей или самолетов), вы можете посмотреть на Пирамида Матч Ядро Граумана и Даррелла.
попробуйте сравнить каждый дескриптор из первого изображения с дескрипторами из второго, расположенного в непосредственной близости (используя евклидово расстояние). Таким образом, каждому дескриптору из первого изображения присваивается оценка на основе степени сходства между ним и наиболее похожим соседним дескриптором из второго изображения. Статистическая мера (сумма, среднее, дисперсия, средняя ошибка и т. д.) всех этих оценок дает вам оценку того, насколько похожи изображения. Экспериментируйте с разными комбинации размера окрестности и статистической меры, чтобы дать вам лучший ответ.
Если вы хотите просто сравнить увеличенное и повернутое изображение с известным центром вращения, вы можете использовать фазовую корреляцию в лог-полярных координатах. По резкости пика и гистограмме фазовой корреляции можно судить о том, насколько близки изображения. Вы также можете использовать евклидово расстояние по абсолютному значению коэффициентов Фурье.
Если вы хотите сравнить дескриптор просеивания, рядом с евклидовым расстоянием вы также можете использовать "диффузное расстояние" - получение дескриптора в более грубом масштабе и объединение их с оригинальным дескриптором. Таким образом," крупномасштабное " сходство функций будет иметь больший вес.
Если вы хотите сделать соответствие между изображениями, вы должны использовать vl_ubcmatch (в случае, если вы его не использовали). Вы можете интерпретировать выходные "оценки", чтобы увидеть, насколько близки объекты. Это представляет собой квадрат евклидова расстояния между двумя соответствующими дескрипторами объектов. Вы также можете изменить порог между Best match и 2nd best match в качестве входных данных.