如何使用SIFT算法计算两个图像的相似度?
computer-vision
matlab
18
0

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

现在我无法弄清楚如何比较描述符以说明图像有多相似

我知道,除非您以前确实玩过这类事情,否则这个问题是无法回答的,但是我认为以前做过此事的人可能会知道 ,所以我发布了这个问题。

我做了很少的工作来生成描述符:

>> 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);
参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

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

如果要比较SIFT描述符,则除了欧几里德距离外,还可以使用“漫射距离”-以越来越粗略的比例获取描述符,并将其与原始描述符连接。这样,“大规模”特征相似性将具有更大的权重。

收藏
评论

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

收藏
评论

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

收藏
评论

首先,您不应该使用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实现

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题