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

StackOverflow https://stackoverflow.com/questions/1500498

Вопрос

Я использовал ПРОСЕЯТЬ внедрение Андреа Ведальди, чтобы вычислить дескрипторы просеивания двух похожих изображений (второе изображение на самом деле представляет собой увеличенное изображение того же объекта под другим углом).

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

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

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

>> 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);
Это было полезно?

Решение

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

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

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

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

Редактировать:Кроме того, существует несколько реализации kd-дерева в MATLAB.

Другие советы

Вам следует прочитать книгу Дэвида Лоу бумага, в котором рассказывается о том, как сделать именно это.Этого должно быть достаточно, если вы хотите сравнить изображения одного и того же объекта.Если вы хотите сопоставить изображения разных объектов одной категории (напримеравтомобили или самолеты) возможно, вы захотите взглянуть на Ядро Соответствия Пирамиде автор: Грауман и Даррелл.

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

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

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

Если вы хотите выполнить сопоставление между изображениями, вам следует использовать vl_ubcmatch (на случай, если вы его еще не использовали).Вы можете интерпретировать выходные "оценки", чтобы увидеть, насколько близки объекты.Это представляет собой квадрат евклидова расстояния между двумя совпадающими дескрипторами объектов.Вы также можете изменить пороговое значение между наилучшим совпадением и 2-м лучшим совпадением в качестве входных данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top