如何使用SIFT算法来计算如何类似的两个图像? [英] How to use SIFT algorithm to compute how similiar two images are?
问题描述
我使用 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屋!