Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何使用SIFT算法计算两个图像的相似度?

我使用了Andrea VedaldiSIFT实现来计算两个相似图像的筛选描述符(第二个图像实际上是从不同角度放大的同一对象的图片)。

现在我无法弄清楚如何比较描述符以说明图像有多相似

我知道,除非您以前确实玩过这类事情,否则这个问题是无法回答的,但是我认为以前做过此事的人可能会知道 ,所以我发布了这个问题。

我做了很少的工作来生成描述符:

>> 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实现



更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 03:24


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.