我有一个(天真的)问题,我只是想澄清这一部分。所以,当我在一张图片上拍摄dsift
时,我通常会得到128xn matrix
。事实上,n值在不同的图像中并不总是相同的。假设图像1获得128x10 matrix
,而图像2获得128x18 matrix
。我不太清楚为什么会这样。
我认为128维的每一列代表单个图像特征或从图像中检测到的单个色块。因此,在128x18的情况下,我们提取了18个补丁并描述了每个补丁128个值。如果这是正确的,为什么我们每个图像都有固定数量的补丁,比如20个补丁,所以每次我们的矩阵都是128x20。
干杯!
答案 0 :(得分:4)
这是因为每个图像检测到的可靠功能的数量会发生变化。仅仅因为您在一个图像中检测到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
矩阵,其中每列的第一行和第二行表示第一图像(第一行)中哪个特征索引与第二图像(第二行)匹配最佳。
执行此操作后,请按升序顺序对分数进行排序。较低的分数意味着更好的匹配,因为两个特征之间的默认匹配方法是Euclidean / L 2 范数。就这样:
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