如何使用SIFT算法来计算如何类似的两个图像?

如何使用SIFT算法来计算如何类似的两个图像?

问题描述:

我使用 SIFT 实施 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 已在 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.