![]() |
如何使用SIFT算法计算两个图像的相似度?
我使用了[URL="http://www.vlfeat.org/overview/sift.html"][B]Andrea Vedaldi[/B][/URL]的[URL="http://en.wikipedia.org/wiki/Scale-invariant_feature_transform"][B]SIFT[/B][/URL]实现来计算两个相似图像的筛选描述符(第二个图像实际上是从不同角度放大的同一对象的图片)。
现在我无法弄清楚[B]如何比较描述符以说明图像有多相似[/B] ? 我知道,除非您以前确实玩过这类事情,否则这个问题是无法回答的,但是我认为[B]以前做过此事的人可能会知道[/B] ,所以我发布了这个问题。 我做了很少的工作来生成描述符: >> 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或[URL="http://opencv.org"]OpenCV中[/URL]实现的[URL="http://people.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN"]FLANN之[/URL]类的近似最近的数字来加快匹配速度。 编辑:此外, [URL="http://www.mathworks.com/matlabcentral/fileexchange/4586"]在MATLAB中[/URL]有几个[URL="http://www.mathworks.com/matlabcentral/fileexchange/4586"]kd-tree实现[/URL] 。 [url=https://stackoverflow.com/questions/1500498]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:22。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.