Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我使用了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); 回答: 首先,您不应该使用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实现 。 更多&回答... |
![]() |
![]() |