sift算法特征点如何匹配?

https://www.zhihu.com/question/23371175

我需要把一张照片和训练集中的图片进行匹配。我把一张照片提取特征值并建立kd树,然后把训练集的图片依次读进来,然后把图片的特征点依次放进kd树里面找最近的点,第一个问题就是这2个点的距离,方向之比,长度之比在什么范围内算是匹配的?第二个问题是匹配的特征点与总共的特征点之比达到什么范围就可以认为2幅图片是匹配的?第三个问题是我们是需要找到一幅匹配的图片就结束还是遍历所有图片以后找到最匹配的图片再结束?

关注者

180

被浏览

21452

添加评论

分享

邀请回答

收起

关注问题写回答

3 个回答

默认排序

小白菜

图像检索/计算机视觉

70 人赞同了该回答

题主应该是如果只是想知道SIFT是怎么在两幅图像间进行匹配的话,下面是我总结的四种匹配方法,希望对题主了解SIFT匹配过程有帮助。

一般在词袋模型中,为了提高检索的精度,你可以通过很多的trick来提高其精度(mAP),其中一个广泛使用的技巧就是对返回的图像进行重排,重排有很多种方法,比如对多特征在分数层(决策层)进行融合也是一种重排方式,不过这里要做的是通过剔除查询图像与候选图像错配点对的方式进行重排,剔除错配点一般采用的是RANSAC算法,关于RANSAC原理可以阅读RANSAC算法做直线拟合这篇文章,或者采用类RANSAC算法。作为初级阶段的实践,这里从两幅图像的匹配逐步深入。

代码下载:下面贴图的结果的代码都可以sift(asift)-match-with-ransac-cpp下载。

1NN匹配

“1NN匹配”(勿wiki,自创的一个词汇),讲起来比较顺口,而且从字面也应该可以猜测出点意思来,所以就这么写在这里了。所谓的“1NN”匹配,即是对于图像im1中的某个SIFT特征点point1,通过在im2图像上所有SIFT关键点查找到与point1最近的SIFT关键点,重复这个过程,即可得到图像im1中所有的特征点在im2中的匹配点(最近邻,1NN)。这种匹配方法,会出现很多的错配点,下面是采用1NN匹配的结果:

从上图可以看到,1NN匹配的方法出现了很多的错配点,而这些错配点对无论是对图像检索中的重排,还是图像拼接等,都是不希望看到的,所以得进一步对其中的错配点对进行剔除,下面采用“1NN/2NN<0.8”的方法进行错配点对剔除。

1NN/2NN<0.8

"1NN/2NN<0.8",不要诧异你未见过这样一种说法,没错,自己瞎创的一种表述。对上面1NN方法理解了,这个水到渠成。所谓“1NN/2NN<0.8”,即对于图像im1中的某个SIFT特征点point1,通过在im2图像上所有SIFT关键点查找到与point1最近的SIFT关键点point21(记该关键点point21到point1的距离为dis1)和次近的关键点point22(记该关键点point22到point1的距离为dis2),如果dis1/dis2<0.8,则我们将其视为正确匹配的点对,否则则为错配的点对予以剔除。这种寻找匹配的方法,由Lowe在其Distinctive image features from scale-invariant keypoints中有说明,当然,0.8这个阈值是可以调整的,不过一般都采用0.8。下面是采用该方法进行匹配后的结果:

可以看到,经过该方法匹配后,相比与“1NN”匹配方法,相比于“1NN”,这种方法进行匹配时有了很大的改善,不过正配点相比与1NN有部分损失。下面再探讨用RANSAC方法对这两种情况进行错配点剔除。

1NN+RANSAC

回到前面的“1NN”匹配的点对,我们再采用RANSAC方法对其进行错配点剔除,RANSAC方法的原理前面已有相关文章RANSAC算法做直线拟合,这里不再重复,相关的代码请看utils.cpp中findInliers函数,调用的是OpenCV中的cv::findFundamentalMat函数计算其变换矩阵,下面是“1NN”经过RANSAC剔除错配点对的结果:

可以看到,经过RANSAC后,“1NN”中的很多错配点对差不多剔除得比较好了,不过还有错配的点对没有剔除掉,图中用红色矩形框标出了未剔除的错配点对。我们在来看看对“1NN/2NN<0.8”进行RANSAC后会是怎样的结果呢?

1NN/2NN<0.8+RANSAC

在看匹配结果前,我们可以先做一个大概的预测,因为“1NN/2NN<0.8”得到的很多点就是正确匹配的点对,所以将其放入RANSAC中后,能够得到很好的拟合模型,所以其剔除错配点对效果也应该更好。为了验证这一预测,我们看一下“1NN/2NN<0.8+RANSAC”具体的效果,如下图所示:

可以看到,已经完全没有错配点了,从这一点来说,其效果是非常好的。不过,从正配点对数目来看,“1NN+RANSAC”的结果更密集,也就是说“1NN+RANSAC”包含了更多的正配点对,“1NN/2NN<0.8+RANSAC”正配点对要稍微少些。在大多数情况下,我们会选择完全剔除了错配点对的模型。

上面分别介绍了两种匹配方法,分别是“1NN”和“1NN/2NN<0.8”匹配方法,以及对它们采用RANSAC剔除错配点对的方法。有时候,如果要求经过RANSAC匹配后保留更多的正配点对,这时候,我们可以采用Affine-SIFT,简称ASIFT,具体可以阅读ASIFT: An Algorithm for Fully Affine Invariant Comparison这篇文章,作者提供了ASIFT的C++代码和匹配算法,可以在ASIFT下载得到,我大概跑了一下里面的demo,相比与SIFT,ASIFT可以提取到很多的关键点,对旋转等变换具有更好的不变性,不过缺点也很明显,速度实在太慢,很难做到实时,所以要使用的话,一般应用在对实时性不做要求的场合。我那个代码里有OpenCV的实现,你也可以试一下其效果,该OpenCV代码实现来源于OPENCV ASIFT C++ IMPLEMENTATION,OpenCV自带其Python实现,使用比较方便,就是速度太慢,所以自己在图像检索在写的项目中,也不打算用它了。

--------------------------------------------------------------------------------------------------------------------------------------------

更新一下:

这两天自己用c++重新写的一个剔除错配点的方法,效果很不错:

先到这里,还有很多坑要填。

编辑于 2015-08-28

7014 条评论

分享

收藏感谢收起

杨延生

更专注才会更自由

10 人赞同了该回答

思路错了!
SIFT特征属于图像局部不变性特征,这类特征比较常用来进行图像配准,注意不是图像匹配,它关心的是图像上像素及像素领域的属性,往往是同一物体在不同位置和不同时刻形成的两幅图像的配准。
图像匹配一般使用全局特征,如颜色直方图,感知哈希编码等特征。

发布于 2014-09-06

108 条评论

分享

收藏感谢

陈曦

多听、多看,少说。

Lowe的SIFT代码网上是有很多大牛写的代码的,参考一下就好。

时间: 2024-08-05 03:46:55

sift算法特征点如何匹配?的相关文章

OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配

在前面的文章<OpenCV中feature2D学习--FAST特征点检测>中讲了利用FAST算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测,并结合SIFT/SURF/BRIEF算子进行特征点提取和匹配. I.结合SIFT算子进行特征点提取和匹配 由于数据类型的不同,SIFT和SURF算子只能采用FlannBasedMatcher或者BruteForceMatcher来进行匹配(参考OpenCV中feature2D学习--BFMatcher和FlannBasedMatcher).

SIFT算法详解(转)

http://blog.csdn.net/zddblog/article/details/7521424 目录(?)[-] 尺度不变特征变换匹配算法详解 Scale Invariant Feature TransformSIFT Just For Fun zdd  zddmailgmailcom or zddhubgmailcom SIFT综述 高斯模糊 1二维高斯函数 2 图像的二维高斯模糊 3分离高斯模糊 1 尺度空间理论 2 尺度空间的表示 3 高斯金字塔的构建 尺度空间在实现时使用高斯金

【转】 SIFT算法详解

尺度不变特征变换匹配算法详解Scale Invariant Feature Transform(SIFT)Just For Fun zdd  [email protected] 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越. 1.SIFT综述 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置.尺度.旋转不变量,此算法由 Da

SIFT算法研究

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://underthehood.blog.51cto.com/2531780/658350 By RaySaint 2011/09/05 1综述 结合论文[1]和Rob Hess的开源SIFT代码(发现OpenCV2.3的源码里也是用的Rob Hess的SIFT代码)对SIFT算法进行了研究,下面是小结: 在计算机视觉的领域中,图像匹配是很多问题最重要的一个方面,包括物体和场景识别,通

SIFT算法的应用--目标识别之Bag-of-words模型

原文:http://blog.csdn.net/v_JULY_v/article/details/6555899 SIFT算法的应用 -目标识别之用Bag-of-words模型表示一幅图像 作者:wawayu,July.编程艺术室出品. 出处:http://blog.csdn.net/v_JULY_v . 引言 本blog之前已经写了四篇关于SIFT的文章,请参考九.图像特征提取与匹配之SIFT算法,九(续).sift算法的编译与实现,九(再续).教你一步一步用c语言实现sift算法.上,及九(

【图像处理之图像的特征检测1】SIFT算法(未完待续)

本文为本人入门学习所用,由参考多方资料整理而成,完成后将加上参考文献 SIFT简介及相关特点 SIFT全称:尺度不变特征转换(Scale-invariant feature transform) 是一种用来侦测与描述影像中的局部性特征的算法:它在空间尺度中寻找极值点,并提取出其位置.尺度.旋转不变量,此算法由David Lowe在1999年所发表,2004年完善总结. SIFT算法的特点有: 1. SIFT特征是图像的局部特征,其对旋转.尺度缩放.亮度变化保持不变性,对视角变化.仿射变换.噪声也

OPENCV下SIFT算法使用方法笔记

这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋.也是醉了!!!!实在看不下去,来点干货.我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这些库完全可以让我们进行傻瓜似的操作.但实际用起来的时候还不是那么简单.下文将对一个典型的基于OPENCV的SIFT特征点提取以及匹配的例程进行分析,并由此分析详细的对OPENCV中SIFT算法的使用进行一个介绍. OPENCV下SIFT特征点提取与匹配的大致流程如下: 读取图片->特征点检测(位置,角度,层)->特征点描述的提取

SIFT算法的Matlab实现

个人博客原文:http://www.sun11.me/blog/2016/sift-implementation-in-matlab/ 这是一次作业,内容是给出两张图像,检测特征点和匹配特征点.要求不能用诸如OpenCV的现成特征点检测函数.于是就只能造轮子了,写了这个Matlab版的sift.(其实就是把c语言的opensift翻译成了matlab 以下是算法流程,其实网上的类似博文已经很多了,只不过我看的过程中也看得不很明白,只能对照着好几个看,所以干脆自己又写了一遍.下面的图均来自于参考资

SIFT算法详解

尺度不变特征变换匹配算法详解Scale Invariant Feature Transform(SIFT)Just For Fun zdd  [email protected] or ([email protected]) 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越. 如果你学习SIFI得目的是为了做检索,也许OpenSSE更适合你,欢迎使用. 1.SIFT综述 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一