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