如何使用SIFT算法计算两个图像的相似程度?

Laz*_*zer 56 matlab image-comparison pattern-matching computer-vision sift

我使用了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);
Run Code Online (Sandbox Code Playgroud)

Jac*_*cob 35

首先,你不应该使用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*');
Run Code Online (Sandbox Code Playgroud)

vl_ubcmatch()基本上执行以下操作:

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

然后,我在F2中找到两个点,比如U和V,它们分别具有来自P的最低和第二低的距离(例如,Du和Dv).

这是Lowe推荐的:如果Dv/Du> = threshold(我在示例代码中使用了1.5),那么这个匹配是可以接受的; 否则,它是模糊匹配的并且作为对应被拒绝,我们不匹配F2到P中的任何点.基本上,如果最佳匹配和次优匹配之间存在很大差异,那么您可以期望这是一个质量匹配.

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

您可以通过多种方式进行匹配.您可以使用MATLAB轻松完成匹配,也可以使用KD树或近似数字搜索(如已在OpenCV中实现的FLANN)加快速度.

编辑:此外,MATLAB中有几个kd-tree实现.


Dim*_*ima 9

您应该阅读David Lowe的论文,该论文将讨论如何做到这一点.如果要比较完全相同的对象的图像,那就足够了.如果你想匹配同一类别的不同物体的图像(例如汽车或飞机),你可能想看看Grauman和Darrell 的金字塔匹配核心.

  • 很高兴看到投票率下降的原因. (2认同)