如何使用SIFT算法来计算如何类似的两个图像? [英] How to use SIFT algorithm to compute how similiar two images are?

查看:955
本文介绍了如何使用SIFT算法来计算如何类似的两个图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 SIFT 实施< a href =http://www.vlfeat.org/~vedaldi/code/sift.html =nofollow noreferrer> Andrea Vedaldi ,以计算sift描述符两个相似的图像(第二个图像实际上是从不同角度放大同一对象的图片)。

I have used the SIFT implementation of Andrea Vedaldi, to calculate the sift descriptors of two similar images (the second image is actually a zoomed in picture of the same object from a different angle).

现在我不能弄清楚

Now I am not able to figure out how to compare the descriptors to tell how similar the images are?

我知道这个问题是不可回答的,除非你已经真正玩过这些类似的东西,但我认为之前已执行此操作的人可能知道此,因此我发布了此问题。

I know that this question is not answerable unless you have actually played with these sort of things before, but I thought that somebody who has done this before might know this, so I posted the question.

描述符:

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


推荐答案

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

First, aren't you supposed to be using vl_sift instead of sift?

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

Second, you can use SIFT feature matching to find correspondences in the two images. Here's some sample code:

    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()基本上执行以下操作:

vl_ubcmatch() essentially does the following:

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

Suppose you have a point P in F1 and you want to find the "best" match in F2. One way to do that is to compare the descriptor of P in F1 to all the descriptors in D2. By compare, I mean find the Euclidean distance (or the L2-norm of the difference of the two descriptors).

然后,我在F2中找到两个点, &

Then, I find two points in F2, say U & V which have the lowest and second-lowest distance (say, Du and Dv) from P respectively.

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

Here's what Lowe recommended: if Dv/Du >= threshold (I used 1.5 in the sample code), then this match is acceptable; otherwise, it's ambiguously matched and is rejected as a correspondence and we don't match any point in F2 to P. Essentially, if there's a big difference between the best and second-best matches, you can expect this to be a quality match.

这很重要,因为图像中模糊匹配的范围很大:假设湖泊或具有多个窗口的建筑物中的匹配点,描述符可以看起来非常相似但是通信显然是错误的。

This is important since there's a lot of scope for ambiguous matches in an image: imagine matching points in a lake or a building with several windows, the descriptors can look very similar but the correspondence is obviously wrong.

你可以用任何方式进行匹配。你可以很容易地用MATLAB自己做,或者你可以加快使用KD树或近似最接近的数字搜索,如 FLANN < a>已在 OpenCV 中实施。

You can do the matching in any number of ways .. you can do it yourself very easily with MATLAB or you can speed it up by using a KD-tree or an approximate nearest number search like FLANN which has been implemented in OpenCV.

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

Also, there are several kd-tree implementations in MATLAB.

这篇关于如何使用SIFT算法来计算如何类似的两个图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆