Dsift (vl_feat) и Matlab

У меня есть (возможно, наивный) вопрос, я просто хотел уточнить эту часть. Итак, когда я беру dsift на одном изображении, я обычно получаю 128xn matrix. Дело в том, что значение n не всегда одинаково для разных изображений. Скажем, изображение 1 получает 128x10 matrix, а изображение 2 получает 128x18 matrix. Я не совсем уверен, почему это происходит.

Я думаю, что каждый столбец 128dimension представляет одну функцию изображения или один патч, обнаруженный на изображении. Итак, в случае 128x18 мы извлекли 18 патчей и описали их по 128 значений каждый. Если это так, то почему мы не можем иметь фиксированное количество патчей на изображение, скажем, 20 патчей, чтобы каждый раз наши матрицы были 128x20.

Ваше здоровье!


person Andr. Ludw.    schedule 08.07.2014    source источник
comment
Если бы вы добавили код к своему вопросу, я бы не стал тратить время на то, чтобы искать не то. Вы имели в виду просеивать, а не просеивать   -  person Bull    schedule 09.07.2014


Ответы (1)


Это связано с тем, что количество надежных функций, обнаруживаемых для каждого изображения, изменяется. Тот факт, что вы обнаруживаете 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
comment
Спасибо!! Отличный ответ!! - person Andr. Ludw.; 09.07.2014
comment
@Андр. Людв, как это может быть отличным ответом, когда ты конкретно спрашивал о dsift, а не sift. Не могли бы вы добавить свой код к вопросу, чтобы прояснить этот момент. - person Bull; 09.07.2014
comment
@B... - vl_sift и vl_dsift по умолчанию вычисляют эквивалентные функции. Вам просто нужно сделать немного предварительной и последующей обработки. Я решил использовать здесь vl_sift, чтобы ОП мог визуально видеть некоторые вещи с минимальной постобработкой. То, что я сказал о sift, по сути то же самое, что и dsift. См. пример здесь: vlfeat.org/matlab/vl_dsift.html . Я добавлю небольшое примечание в начале своего поста, чтобы убедиться, что это предполагается. Спасибо за указание на разницу, но не нужно быть снисходительным. - person rayryeng; 09.07.2014
comment
@Andr.Ludw. - Пожалуйста. Я рад, что это адекватно ответил на ваш вопрос. - person rayryeng; 09.07.2014
comment
@rayryeng Я думаю, что vl_sift и vl_dsift вычисляют одни и те же функции, когда точки одинаковы, но vl_dsift вычисляет их каждые step пикселя, тогда как vl_sift вычисляет их только в ключевых точках. Я был действительно озадачен тем, как vl_dsift может возвращать разное количество функций для изображений одинакового размера. Теперь кажется, что вопрос был вовсе не о dsift, и я потратил свое время на размышления об этом. Но для простого просеивания у вас хороший ответ. - person Bull; 09.07.2014
comment
@Б... - Согласен. Я считаю, что этот вопрос не зависел от того, какой тип SIFT рассчитывался. ОП просто хотел выяснить, почему для каждого изображения обнаруживается разное количество функций, независимо от используемого метода. - person rayryeng; 09.07.2014