特征匹配需要考虑匹配策略和如何更快的完成匹配。

一:以欧式距离为度量,有三种匹配策略:固定阈值、最近邻、最近邻距离比率(NNDR)

固定阈值:就是设定一个阈值,当距离大于阈值,判为不匹配,否则判为匹配。但是一个问题是,阈值很难设定。随着移动到特征空间的不同部分时,阈值的有效范围会变化很大,即没有通用的阈值。

最近邻:找最近的那个。

最近邻距离比率:定义为最近邻距离和次近邻距离的比值。

最近邻和NNDR策略改善了匹配效果。

——————————————————————————————————————

————————————更详细的介绍————————————————————

参考:结合NNDR与霍夫变换的匹配方法。

在建立两幅图像之间局部特征的匹配关系时,需要满唯一性、相似性、连续性三个基本约束条件,即物体表面任意一点到观察点距离是唯一的,因此其视差是唯一的,给定一副图像中的一点,其在另一幅图像中对应的匹配点最多只有一个;对应的特征应有相同的属性,在某种度量下,同一物理特征在两幅图像中具有相似的描述符;与观测点的距离相比,物体表面因凹凸不平引起的深度变化是缓慢的,因而视差变化是缓慢的,或者说视差具有连续性。

目前常用的目标匹配策略有两种:1、是距离阈值法,即待匹配目标与模型之间的距离小于某个阈值,则认为匹配上了,改方法非常简单,但是阈值的确定非常困难,而且目标很容易匹配上多个模型,从而产生大量的误匹配;2、最小距离法,即目标只匹配与其距离最近的模型,实际应用中一般还需要满足距离小于某个阈值的条件,该方法只有一个最佳的匹配结果,相对于距离阈值法来说,正确率要高。

由于图像的内容千差万别,加上场景中运动物体,不重叠内容以及图像质量等因素的存在,一副图像中的局部特征并不一定能够在另一幅图像中找到相似的特征,这就需要采取措施剔除那些产生干扰的噪声点。

3、通过对SIFT特征的研究表明,可以通过比较最近邻特征和次近邻特征的距离有效的甄别局部特征是否正确匹配。这就是最近邻距离比值法。该方法的理论来源是,如果一个特征在一副图像中与两个特征的距离都很相似,那么该特征的区分度较低,会对图像相似度的判断产生干扰。

——————————————————————————————————————

——————————————————————————————————————

二:高效完成匹配

选定匹配策略,下面要做的就是在潜在的候选中高效地进行搜索。

1、用穷举法搜索最近邻点以及次紧邻点,即在每对潜在的匹配图像中将特征和其他所有特征进行一一匹配。想法简单自然,并且可以得到最精确的结果,但是由于特征空间一般都高达128维以上,加之复杂图像的局部特征数量比较多,搜索算法的效率是整个系统的一个瓶颈。

2、导出一个索引结构,来快速寻找一个给定特征的邻近的特征。广泛使用的索引结构是多维搜索树,这里介绍最著名的k-d树,

因为实际数据一般都会呈现簇状的聚类形态,因此我们想到建立数据索引,然后再进行快速匹配。索引树是一种树结构索引方法,其基本思想是对搜索空间进行层次划分。k-d 树是索引树中的一种典型方法。

2-1、k-d树

是对数据点在k维空间中划分的一种数据结构。k-d树实际上是一种二叉树。

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

k-d树的节点组成集合为样本集,每个结点表示一个样本点。根据分裂结点的分割超平面将样本空间分为两个子空间。左子空间中的样本点集合由左子树表示,右空间中的样本点集合由右子树表示。分割超平面是一个通过分裂点并且垂直于分割序号所指示的方向轴的平面。

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

一个简单例子说明分割:在二维的情况下,一个样本点可以由二维向量(x,y)表示,其中令x维的序号为0,y维的序号为1.假设分裂结点为(7,2),垂直于分割超平面的方向轴序号为0,那么分割超平面就是x=7,他垂直于x轴且过点(7,2)如下所示:

(红线代表分割超平面)

于是其他数据点的x维如果小于7,则被分配到左子空间;若大于7,则被分配到右子空间。如(5,4)被分配到左子空间,(9,6)被分配到右子空间。

所以可看出k-d树本质上是一种二叉树。

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

分裂结点的选择通常有多种方法,最常用的一种方法:对于所有的样本点,统计他们在每个维上的方差,挑选出方差中的最大值,对应的维就是垂直于分割超平面的方向轴,如x轴上方差最大则分割超平面垂直于x轴画出。数据方差最大表明沿该维度数据点分散的比较开,这个方向进行数据分割可以获得最好的分辨率。然后再将所有样本点在以上方向轴方向进行排序。。

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

一个例子来说明:

假设样本集为{(2,3),(5,4)(9,6)(4,7)(8,1)(7,2)}。构建k-d树的过程如下:

1、确定split域。6个数据点在x,y维度上的数据方差分别为39,28.63。所以在x轴上方差最大,所以split阈值为0(x维的序号为0)

2、确定分裂结点,根据x维上的值将数据排序,则6个数据点在排序后位于中间的那个数据点为(7,2),该结点就是分割超平面就是通过(7,2)并垂直于split=0即x轴的直线x=7;

3、左子空间和右子空间,分割超平面x=7将整个空间分为两部分,x<=7的部分为左子空间,包含3个数据点{(2,3)(5,4)(4,7)}另一部分为右子空间,包含2个数据点{(9,6)(8,1)}

4、分别对左子空间中的数据点和右子空间中的数据点重复上面的步骤构建左子树和右子树直到经过划分的子样本集为空。

————————————————————————————————————————

————————————————————————————————————————

k-d树的最近邻搜索算法:

在k-d树中进行数据的k近邻搜索是特征匹配的重要环节,其目的是检索在k-d树中与待查询点距离最近的k个数据点。

最近邻搜索是k近邻的特例,即1近邻。最近邻搜索的思路很简单:首先通过二叉树搜索(比较待查询结点和分裂结点的分裂维的值,小于等于则进入左分支,大于就进入右分支直到叶子结点),顺着“搜索路径”很快能找到最近邻的近似点,也就是与待查查询点处于同一个子空间的叶子结点;然后再回溯搜索路径,并判断搜索路径上的 结点的其他子节点空间中是否可能有距离查询点更近的数据点,如有可能,则需要跳到其它子结点空间中去搜索(将其他子结点加入到搜索路径)。重复这个过程直到搜索路径为空。

——————————————————————————————————————————————

举例说明最近邻搜索算法:

假设根据之上步骤样本集{(2,3)(5,4)(9,6)(4,7)(8,1)}建立了k-d树。,将上面的图转换成树形图如下:

我们查找点(2.1,3.1),在(7,2)点测试到达(5,4),在(5,4)点测试到达(2,3),然后搜索路径中的结点为<(7,2)(5,4)(2,3)>,从搜索路径中取出(2,3)作为当前最佳结点nearest,距离dist为0.141.

然后回溯到(5,4),以(2.1,3.1)为圆心,以dist=0.141为半径画一个圆,并不和超平面y=4相交,如下图,所以不必跳到结点(5,4)的右子空间去搜索,因为右子空间中不可鞥有更近样本点了。

于是在回溯到(7,2),同理以(2.1,3.1)为圆心,以dist=0.141为半径画一个圆并不和超平面x=7相交,所以不必跳到结点(7,2)的右子空间去搜索。

至此,search_path为空,结束整个搜索,返回nearest(2,3)作为(2.1,3.1)的最近邻点,最近距离为0.141。

然而有时有些复杂情况。如查找点(2,4.5),在(7,2)处测试到达(5,4),在(5,4)处测试到达(4,7)。然后搜索路径search_path中的结点为<(7,2)(5,4)(4,7)>,从搜索路径search_path中取出(4,7)作为当前最佳结点nearest,距离dist=3.202.

然后回溯到(5,4),以(2,4.5)为圆心,以dist=3.202为半径画一个圆与超平面y=4相交。如下图,所以需要跳到(5,4)的左子空间去搜索。所以要将(2,3)加入到搜索路径search_path中,所以现在search_path中的结点为<(7,2)(2,3)>;又因为(5,4)与(2,4.5)的距离为3.04小于距离dist=3.202所以将(5,4)付给nearest并且dist=3.04.

回溯至(2,3),(2,3)是叶子节点,直接判断(2,3)是否离(2,4.5)更近,计算得到距离为1.5,所以nearest更新为(2,3),dist更新为1.5.

回溯至(7,2),同理,以(2,4.5)为圆心,以dist=1.5为半径画一个圆并不和超平面x=7相交,所以不用跳到结点(7,2)的右子空间去搜索。

至此,search_Path为空,结束整个搜索,返回nearest(2,3)作为(2,4.5)的最近邻点。最近邻距离为1.5

还可以参考:July的http://blog.sina.com.cn/s/blog_52284fb50101218x.html,写的很好!

上面两次搜索返回的最近邻点虽然是一样的,但是搜索(2,4.5)的过程要复杂的多,因为(2,4.5)更接近超平面。研究表明当查询点的邻域与分割超平面两侧的空间都产生交集时,回溯的次数大大增加。由于大量回溯会导致k-d树最近邻搜索的性能大大下降,因此提出了一些改进方法,比较著名的就是Best--Bin--First (BBF算法)。他通过设置优先级队列和运行超时限定来获取

2-2 BBF算法

BBF算法是KD树的改进方法,从上述标准的KD树的查询过程可以看出其搜索过程中的“回溯”是由“查询路径”决定的,并没有考虑查询路径上一些数据点本身的一些性质。一个简单的改进思路就是将“查询路径”上的结点进行排序,如按各自分割超平面(也称bin)与查询点的距离排序,也就是说,回溯检查总是从优先级最高(best bin)的树结点开始。

BBF算法是针对高维数据提出的一种近似算法,此算法能确保优先检索包含最近邻点可能性较高的空间,此外,BBF还设置了一个运行超时限定机制。

————————————————————————————————————————————————

一个例子说明,还是查询(2,4.5)搜索算法流程为:

1、将(7,2)压入优先队列中;

2、提取优先队列中(7,2),由于(2,4.5)位于(7,2)分割超平面的左侧,所以检索其左子节点(5,4)。同时,根据BBF机制“搜索左/右子树,就把相应这一层的兄弟结点即右/左结点存进队列”,将其(5,4)对应的兄弟结点即右子节点(9,6)压入优先队列中,此时优先队列为{(9,6)},最佳点为(7,2);然后一直检索到叶子节点(4,7),此时优先队列为{(2,3)(9,6)},最佳点则为(5,4)

3、提取优先级最高的结点(2,3),重复步骤2,直到优先队列为空。

参考整理自:

1、http://blog.sina.com.cn/s/blog_52284fb50101218x.html

2、http://blog.sina.com.cn/s/blog_52284fb50101218x.html

特征匹配-NNDR策略,kd树,BBF算法相关推荐

  1. 【特征匹配】SIFT原理之KD树+BBF算法解析

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/47606159 继上一篇中已经介绍了SIFT原理与C源码剖析,最后得到了一系列特 ...

  2. k-d树+bbf算法的介绍与实现

    最近还是一直在研究SIFT算法,而SIFT特征点匹配是一个比较经典的问题,使用暴力匹配的话确实可以得到结果,但是运行速度较慢.我的计算机处理是i5的二代系列,匹配两张各检测有2000+个SIFT特征点 ...

  3. 机器学习算法(二十五):KD树详解及KD树最近邻算法

    目录 1 KD树 1.1 什么是KD树 1.2 KD树的构建 1.3 KD树的插入 1.4 KD树的删除 1.5 KD树的最近邻搜索算法 1.5.1 举例:查询点(2.1,3.1) 1.5.2 举例: ...

  4. KD树详解及KD树最近邻算法

    参考:http://blog.csdn.net/app_12062011/article/details/51986805 http://www.cnblogs.com/snake-hand/arch ...

  5. KNN—Kd树—BBF优化

    一.KD树基本解释 1.1.基础概念 为了优化KNN的计算,使用KD树解决通过距离函数在高维矢量之间进行相似性检索的问题,快速而准确地找到查询点的近邻. 索引结构中相似性查询: 范围查询:给定查询点和 ...

  6. java knn kd树_KNN算法之KD树(K-dimension Tree)实现 K近邻查询

    KD树是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的搜索,如范围搜索和最近邻搜索. KD树使用了分治的思想,对比二叉搜索树(BST),KD树解决的是多维空间内的最近点(K近点)问题.( ...

  7. KD树+BBF+KNN使用C#实现(3)

    前面讲解了KD树的实现以及在KD树的基础之上进行的最近近邻查找,但是KD树上的最近邻查找有一个问题,在我系列中第一篇的提到的参考文章中就讲到KD树搜索最近邻节点的问题.在进行回溯查找的过程是一直到根节 ...

  8. [图像特征匹配]SIFT、SURF、ORB算法笔记以及代码实现

    SIFT.SURF.ORB算法学习笔记 文章目录 SIFT.SURF.ORB算法学习笔记 一. SIFT (1)构建尺度空间 (2)使用DOG近似LOG定位极值点(关键点) (3)计算关键点方向 (4 ...

  9. Kd树+BBF(最邻近、次邻近查询)Python实现

    python2.7 import numpy as np 构建Kd树: KD树的构造  一维的二叉查找树很好构造,先对所有数据排序,然后每次取中值,把数据分成两半,左半为左子树,右半为右子树:然后递归 ...

最新文章

  1. 简单介绍自动化运维工具clip
  2. 每日一博 - Semaphore使用场景分析以及源码分析
  3. wxWidgets:wxWindow类用法
  4. 记一次ubuntu阿里的下载源的问题
  5. agv ti 毫米波雷达_华为将利用 5G 开发激光雷达和毫米波雷达 - 产业资讯 -AGV产业联盟官方网站 -新战略机器人网-工业、服务、AGV机器人产业资讯传播者...
  6. plsql轻量版游标的使用2
  7. c语言保存后怎么打开文件,保存打开文件之后,怎么也不能在显示函数中出来。。...
  8. JAVA听力源码_剑桥雅思13Test4Section4听力原文与答案 The History of Coffee
  9. 做了一天的程序,很困啊,明天还要赶着去上课
  10. Java会走向晦暗吗?Kotlin会取而代之吗
  11. V4L2驱动的移植与应用(三)
  12. mac os x excel 单元格换行
  13. 性能测试监控TP50、TP99、TP999含义
  14. html 与 css 画哆啦A梦
  15. Day_06 传智健康项目-移动端开发-体检预约
  16. consul kv迁移
  17. Android调用系统自带的文件管理器进行文件选择
  18. VMware CentOS6.5 安装VMware Tools
  19. 全景视频拼接算法参考资料
  20. 微信支付:小程序支付/扫码支付

热门文章

  1. Python游戏开发,pygame模块,Python实现接水果和金币小游戏
  2. C#数组程序案例1 把数组中指定的下标索引打印出来
  3. vo在自动驾驶中的应用(一)
  4. cordic实现对数运算
  5. 360手机论坛刷机包 360手机ROM下载 360手机官网刷机包 360手机刷机包分享下载
  6. Android之场景桌面(一)
  7. python创建数据库并对表结构备份_Python 数据库表操作之多表结构的创建与分析...
  8. 【ffmpeg+cuda实现硬编解码】
  9. 正则表达式 判断年月日合法性
  10. _tmain与main,winMain,wmain