SIFT的一些细节问题(三)

来源:互联网 发布:如何做淘宝产品推广 编辑:程序博客网 时间:2024/05/10 01:51

      其实以下问题不一定要归结到SIFT的内容当中来,因为这是关于特征点匹配方面的,只是由于我是在看SIFT的时候接触到这些,并且也只是有一点粗浅的了解,将一些基础的总结性的知识储备在这里吧。不能算问题,只能是知识点。

      1、特征匹配算法分类。通常特征匹配算法可以分为两类。一类是线性扫描法,即穷举法。第二类是建立数据索引,然后再进行快速匹配。索引树就是第二类中的一种,其基本思想是对搜索空间进行层次划分。根据划分的空间是否有混叠(Overlap)可以分为Clipping和Overlapping两种。前者划分的空间没有重叠部分,其代表为Kd-树,后者划分的空间有交叠,但是交叠区内的数据点只能出现在其中的一个空间中,其代表为R-树。Lowe的SIFT在进行特征匹配时采用的Kd-树结构进行匹配。

      2、Kd-树建立。简单地说,Kd-树是将n维特征向量按照一定的规则在某一维中划一条“直线”,将数据分为左右两个子空间,然后再迭代地进行此过程(个人认为其思想可可能来源于二叉树,O(∩_∩)O)。具体分为以下几个步骤(非形式化描述):

      (1)确定split域。对所有数据点的各个维度上的数据求方差,选择方差最大的轴(维)作为split域(即要在这个轴上“开刀”、“画直线”)。

      (2)确定Node-data。根据前面所确定的那一维,取所有数据点在这一维上的中值(上取整),作为要分割的数据点,即画一条通过此点并分割此轴的“直线”。

      (3)将数据分为左右两个子空间,并将此Node-data作为其父节点。

      (4)重复上述过程直到数据划分完毕。

      至此Kd-树建立好了,Kd-树有以下几个优点:(1)比较容易刻画数据的聚簇性质;(2)其切分空间的局部分辨率可以调整;(3)切割面的法向可以调整。

      3、最近邻查询算法。Kd-树已经建立,怎样寻找一个数据点在Kd-树种的最近邻点呢?简单地说(好像还不是很容易一两句话就说清楚),将数据点按照二叉树树的结构依次找,找到“最近点”(此时表示在树中最近,但是距离并不一定是最近),然后进行回溯,需要将查询路径回溯完毕,则可以找出最近距离的点。无疑这里的回溯过程是影响匹配效率的瓶颈。于是就有了对之所做的改进算法——BBF(Best-Bin-First)查询机制,即在回溯时按照优先级进行回溯,通过建立优先队列,可以在任何时候中断退出查询过程,并且总能得到比较好的结果,以精度换时间。另外还有一种改进,就是Spill-树,这种树的不同之处在于在每条“直线”两边有一个“子带”,如果数据落入了这个子带之内,则认为已经很接近,不需要再回溯其他节点(具体过程我就没有关注了)。

      4、匹配对提纯。匹配好的匹配对并非完全正确,这时需要将匹配错误的剔除。

      (1)比值提纯法。就是利用最近邻与次近邻的比值作为阈值进行判断,Lowe的SIFT就采用这种方法,简单。

      (2)一致性提纯法。为了消除错误数据的影响,通常有最小中值法(Least Median of Squares,LMS),M估计法,MLESAC算法,RANSAC算法。其中RANSAC算法实现简单,性能良好,经常被采用。简单地说,随机抽样一致性RANSAC(Random Sample Consensus)的主要思路是通过采样和验证的策略,求解大部分样本都能满足的数学模型。即在样本点中找出计算模型所需的最少样本数,分别计算出不同的模型(如果有m个样本,计算模型需要n个,这需要求出clip_image002[15]个模型),在数据集中统计符合这些模型的样本数,符合样本数最多的那个模型被认为是最终的模型。

 

      ps:以上内容根据王永明的《图像局部不变性特征与描述》一书中相关内容整理而成。

原创粉丝点击