Laz*_*zer 56 matlab image-comparison pattern-matching computer-vision sift
我使用了Andrea Vedaldi的SIFT实现来计算两个相似图像的筛选描述符(第二个图像实际上是从不同角度放大同一个对象的图片).
现在我无法弄清楚如何比较描述符以告诉图像有多相似?
我知道这个问题是不负责任的,除非你之前真的玩过这些东西,但我认为之前做过这个的人可能知道这个,所以我发布了这个问题.
我做的很少生成描述符:
>> 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)加快速度.
归档时间: |
|
查看次数: |
52956 次 |
最近记录: |