57

我使用了Andrea Vedaldi的SIFT实现来计算两个相似图像的筛选描述符(第二个图像实际上是从不同角度放大的同一对象的图片)。

现在我无法弄清楚如何比较描述符来判断图像有多相似

我知道这个问题是无法回答的,除非你以前真的玩过这些东西,但我认为以前做过这个的人可能知道这个,所以我发布了这个问题。

我为生成描述符所做的小事:

>> 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);
4

5 回答 5

37

首先,您不应该使用 vl_sift 而不是 sift 吗?

其次,您可以使用 SIFT 特征匹配来查找两幅图像中的对应关系。这是一些示例代码:

    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() 本质上做了以下事情:

假设您在 F1 中有一个点 P,并且您想在 F2 中找到“最佳”匹配。一种方法是将 F1 中的 P 描述符与 D2 中的所有描述符进行比较。通过比较,我的意思是找到欧几里得距离(或两个描述符差异的 L2 范数)。

然后,我在 F2 中找到两个点,比如 U 和 V,它们分别与 P 的距离最小和次低(比如 Du 和 Dv)。

下面是 Lowe 的建议:如果 Dv/Du >= 阈值(我在示例代码中使用了 1.5),那么这种匹配是可以接受的;否则,它会模棱两可地匹配并被拒绝为对应关系,并且我们不会将 F2 中的任何点与 P 匹配。本质上,如果最佳匹配和次佳匹配之间存在很大差异,则可以预期这是质量匹配。

这一点很重要,因为图像中有很多模糊匹配的范围:想象在湖泊或具有多个窗户的建筑物中的匹配点,描述符可能看起来非常相似,但对应关系显然是错误的。

您可以通过多种方式进行匹配。您可以使用 MATLAB 自己轻松完成匹配,也可以使用 KD-tree 或近似最近数搜索(如OpenCV中实现的FLANN )来加速匹配。

编辑:另外,在 MATLAB 中有几个kd-tree 实现

于 2009-10-01T04:33:28.747 回答
9

您应该阅读 David Lowe 的论文,其中讨论了如何做到这一点。如果您想比较完全相同对象的图像,这就足够了。如果您想匹配同一类别的不同对象(例如汽车或飞机)的图像,您可能需要查看 Grauman 和 Darrell 的Pyramid Match Kernel

于 2009-10-01T15:12:53.747 回答
3

尝试将第一张图像中的每个描述符与位于附近的第二张图像中的描述符进行比较(使用欧几里得距离)。因此,您可以根据第一张图像中的每个描述符与第二张图像中最相似的邻居描述符之间的相似程度为每个描述符分配一个分数。所有这些分数的统计测量(总和、平均值、离散度、平均误差等)可以让您估计图像的相似程度。尝试附近大小和统计测量的不同组合,为您提供最佳答案。

于 2009-09-30T21:48:06.583 回答
2

如果您只想将缩放和旋转的图像与已知的旋转中心进行比较,您可以在对数极坐标中使用相位相关。通过峰值的清晰度和相位相关的直方图,您可以判断图像的接近程度。您还可以对傅立叶系数的绝对值使用欧几里得距离。

如果你想比较 SIFT 描述符,除了欧几里得距离之外,你还可以使用“漫反射距离”——在更粗略的尺度上获取描述符并将它们与原始描述符连接起来。这样,“大规模”特征相似性就会有更大的权重。

于 2009-10-01T19:21:44.540 回答
0

如果你想在图像之间进行匹配,你应该使用 vl_ubcmatch (以防你没有使用它)。您可以解释输出的“分数”以查看特征的接近程度。这表示两个匹配特征描述符之间的欧几里得距离的平方。您还可以更改最佳匹配和第二最佳匹配之间的阈值作为输入。

于 2013-07-04T18:48:45.727 回答