1

我有一个(可能是天真的)问题,我只是想澄清这部分。因此,当我拍摄dsift一张图像时,我通常会得到一个128xn matrix. 问题是,n 值在不同的图像中并不总是相同的。假设图像 1 得到一个128x10 matrix,而图像 2 得到一个128x18 matrix。我不太确定为什么会这样。

我认为 128 维的每一列代表一个图像特征或从图像中检测到的单个补丁。所以在 128x18 的情况下,我们提取了 18 个补丁并用每个 128 个值来描述它们。如果这是正确的,为什么我们不能每个图像有固定数量的补丁,比如 20 个补丁,所以每次我们的矩阵都是 128x20。

干杯!

4

1 回答 1

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 。无论哪种方式,选择最可靠特征的想法都适用于siftdsift

例如,假设IaIbuint8同一物体或场景的灰度图像。您可以先通过 SIFT 检测特征,然后匹配关键点。

[fa, da] = vl_sift(im2single(Ia));
[fb, db] = vl_sift(im2single(Ib));
[matches, scores] = vl_ubcmatch(da, db);

matches包含一个2 x N矩阵,其中每列的第一行和第二行表示第一张图像(第一行)中的哪个特征索引与第二张图像(第二行)最匹配。

完成此操作后,按升序对分数进行排序。较低的分数意味着更好的匹配,因为两个特征之间的默认匹配方法是欧几里得 / 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
于 2014-07-09T00:09:50.163 回答