Как использовать алгоритм SIFT, чтобы вычислить, насколько похожи два изображения? - PullRequest
52 голосов
/ 01 октября 2009

Я использовал SIFT реализацию Андреа Ведальди , чтобы вычислить дескрипторы просеивания двух похожих изображений (второе изображение на самом деле увеличенное изображение одного и того же объекта под другим углом).

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

Я знаю, что этот вопрос не подлежит ответственности, если вы на самом деле не играли с подобными вещами раньше, но я подумал, что кто-то, кто делал это раньше, может знать это , поэтому я разместил вопрос.

мало что я сделал для генерации дескрипторов:

>> 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 ]

34 голосов
/ 01 октября 2009

Во-первых, разве вы не должны использовать vl_sift вместо sift?

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

    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> = порог (я использовал 1,5 в примере кода), то это соответствие приемлемо; в противном случае, он неоднозначно сопоставляется и отклоняется как корреспонденция, и мы не сопоставляем ни одного пункта в F2 с P. По существу, если существует большая разница между лучшим и вторым лучшим совпадениями, вы можете ожидать, что это будет качественное совпадение.

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

Вы можете выполнить сопоставление любым количеством способов. Вы можете сделать это самостоятельно с помощью MATLAB или ускорить его с помощью KD-дерева или приблизительного поиска ближайшего номера, например FLANN который был реализован в OpenCV .

EDIT: Также в MATLAB .

есть несколько реализаций kd-дерева.
9 голосов
/ 01 октября 2009

Вам следует прочитать статью Дэвида Лоу , в которой рассказывается, как именно это сделать. Этого должно быть достаточно, если вы хотите сравнить изображения одного и того же объекта. Если вы хотите сопоставить изображения разных объектов одной и той же категории (например, автомобили или самолеты), вы можете посмотреть на Pyramid Match Kernel от Grauman и Darrell.

3 голосов
/ 01 октября 2009

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

2 голосов
/ 01 октября 2009

Если вы хотите просто сравнить увеличенное и повернутое изображение с известным центром вращения, вы можете использовать фазовую корреляцию в лог-полярных координатах. По четкости пика и гистограмме фазовой корреляции можно судить о том, насколько близки изображения. Вы также можете использовать евклидово расстояние по абсолютной величине коэффициентов Фурье.

Если вы хотите сравнить дескриптор SIFT, помимо евклидова расстояния вы также можете использовать «диффузное расстояние» - получить дескриптор в более грубом масштабе и объединить их с оригинальным дескриптором. Таким образом, «крупномасштабное» сходство характеристик будет иметь больший вес.

0 голосов
/ 04 июля 2013

Если вы хотите сделать сопоставление между изображениями, вы должны использовать vl_ubcmatch (если вы его не использовали). Вы можете интерпретировать выходные «оценки», чтобы увидеть, насколько близки объекты. Это представляет квадрат евклидова расстояния между двумя совпадающими дескрипторами объектов. Вы также можете изменить порог между Best match и 2nd best match в качестве входных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...