Это связано с тем, что количество надежных функций, обнаруживаемых для каждого изображения, изменяется. Тот факт, что вы обнаруживаете 10 признаков на одном изображении, не означает, что вы сможете обнаружить такое же количество признаков на другом изображении. Что имеет значение, так это то, насколько точно одна функция одного изображения соответствует другой.
Что вы можете сделать (если хотите), так это извлечь, скажем, 10 наиболее надежных функций, которые лучше всего соответствуют двум изображениям, если вы хотите иметь что-то постоянное. Выберите число, которое меньше или равно минимальному числу обнаруженных исправлений между ними. Например, предположим, что вы обнаружили 50 объектов на одном изображении и 35 объектов на другом изображении. После этого, когда вы пытаетесь сопоставить функции вместе, это приводит к... скажем... 20 лучшим совпадениям. Вы можете выбрать лучшие 10, или 15, или даже все точки (20) и продолжить оттуда.
Я собираюсь показать вам пример кода, чтобы проиллюстрировать мою точку зрения выше, но имейте в виду, что я буду использовать vl_sift
, а не vl_dsift
. Причина в том, что я хочу показать вам визуальные результаты с минимальной предварительной и последующей обработкой. Если вы решите использовать vl_dsift
, вам нужно будет немного поработать до и после вычисления функций с помощью dsift
, если вы хотите визуализировать те же результаты. Если вы хотите увидеть код для этого, вы можете посетить vl_dsift
страницу справки здесь: http://www.vlfeat.org/matlab/vl_dsift.html. В любом случае идея выбора наиболее надежных функций применима как к sift
, так и к dsift
.
Например, предположим, что Ia
и Ib
являются uint8
изображениями в градациях серого одного и того же объекта или сцены. Вы можете сначала обнаружить функции с помощью SIFT, а затем сопоставить ключевые точки.
[fa, da] = vl_sift(im2single(Ia));
[fb, db] = vl_sift(im2single(Ib));
[matches, scores] = vl_ubcmatch(da, db);
matches
содержит матрицу 2 x N
, где первая и вторая строки каждого столбца обозначают, какой индекс функции в первом изображении (первая строка) лучше всего соответствует второму изображению (вторая строка).
Сделав это, отсортируйте баллы в возрастающем порядке. Более низкие баллы означают лучшее совпадение, поскольку методом сопоставления по умолчанию между двумя объектами является норма Евклида / L2. Как таковой:
numBestPoints = 10;
[~,indices] = sort(scores);
%// Get the numBestPoints best matched features
bestMatches = matches(:,indices(1:numBestPoints));
Затем это должно вернуть 10 лучших совпадений между двумя изображениями. FWIW, ваше понимание того, как функции представлены в vl_feat
, является точным. Они хранятся в da
и db
. Каждый столбец представляет собой дескриптор определенного фрагмента изображения и представляет собой гистограмму из 128 записей, поэтому на каждый объект приходится 128 строк.
Теперь, в качестве дополнительного бонуса, если вы хотите отобразить, как каждая функция одного изображения соответствует другому изображению, вы можете сделать следующее:
%// Spawn a new figure and show the two images side by side
figure;
imagesc(cat(2, Ia, Ib));
%// Extract the (x,y) co-ordinates of each best matched feature
xa = fa(1,bestMatches(1,:));
%// CAUTION - Note that we offset the x co-ordinates of the
%// second image by the width of the first image, as the second
%// image is now beside the first image.
xb = fb(1,bestMatches(2,:)) + size(Ia,2);
ya = fa(2,bestMatches(1,:));
yb = fb(2,bestMatches(2,:));
%// Draw lines between each feature
hold on;
h = line([xa; xb], [ya; yb]);
set(h,'linewidth', 1, 'color', 'b');
%// Use VL_FEAT method to show the actual features
%// themselves on top of the lines
vl_plotframe(fa(:,bestMatches(1,:)));
fb2 = fb; %// Make a copy so we don't mutate the original
fb2(1,:) = fb2(1,:) + size(Ia,2); %// Remember to offset like we did before
vl_plotframe(fb2(:,bestMatches(2,:)));
axis image off; %// Take out the axes for better display
person
rayryeng
schedule
09.07.2014