FAST特征原理

来源:互联网 发布:巨人网络借壳上市时间 编辑:程序博客网 时间:2024/04/28 23:59

Opencv FAST特征检测源码:http://blog.csdn.net/quincuntial/article/details/50461521

Features From Accelerated Segment Test

1. Fast算法原理

博客中已经介绍了很多图像特征检测算子,我们可以用LoG或者DoG检测图像中的Blobs(斑点检测),可以根据图像局部的自相关函数来求得Harris角点(Harris角点),后面又提到了两种十分优秀的特征点及它们的描述方法SIFT特征与SURF特征。SURF特征算是为了提高运算效率对SIFT特征的一种近似,虽然在有些实验环境中已经达到了实时,但是我们实践工程应用中,特征点的提取与匹配只是整个应用算法中的一部分,所以我们对于特征点的提取必须有更高的要求,从这一点来看前面介绍的的那些特征点方法都不可取。

为了解决这个问题,Edward Rosten和Tom Drummond在2006年发表的“Machine learning for high-speed corner detection[1]”文章中提出了一种FAST特征,并在2010年对这篇论文作了小幅度的修改后重新发表[2]。FAST的全称为Features From Accelerated Segment Test。Rosten等人将FAST角点定义为:若某像素点与其周围领域内足够多的像素点处于不同的区域,则该像素点可能为角点。也就是某些属性与众不同,考虑灰度图像,即若该点的灰度值比其周围领域内足够多的像素点的灰度值大或者小,则该点可能为角点。

2. FAST算法步骤

  1. 从图片中选取一个像素$P$,下面我们将判断它是否是一个特征点。我们首先把它的亮度值设为$I_p$。
  2. 设定一个合适的阈值$t$。
  3. 考虑以该像素点为中心的一个半径等于3像素的离散化的Bresenham圆,这个圆的边界上有16个像素(如图1所示)。

    A corner in the image

    图1 FAST特征点示意图

  4. 现在,如果在这个大小为16个像素的圆上有$n$个连续的像素点,它们的像素值要么都比$I_p + t$大,要么都比$I_p - t$小,那么它就是一个角点。(如图1中的白色虚线所示)。$n$的值可以设置为12或者9,实验证明选择9可能会有更好的效果。

上面的算法中,对于图像中的每一个点,我们都要去遍历其邻域圆上的16个点的像素,效率较低。我们下面提出了一种高效的测试(high-speed test)来快速排除一大部分非角点的像素。该方法仅仅检查在位置1,9,5和13四个位置的像素,首先检测位置1和位置9,如果它们都比阈值暗或比阈值亮,再检测位置5和位置13。如果$P$是一个角点,那么上述四个像素点中至少有3个应该必须都大于$I_p+t$或者小于$I_p-t$,因为若是一个角点,超过四分之三圆的部分应该满足判断条件。如果不满足,那么$p$不可能是一个角点。对于所有点做上面这一部分初步的检测后,符合条件的将成为候选的角点,我们再对候选的角点,做完整的测试,即检测圆上的所有点。

上面的算法效率实际上是很高的,但是有点一些缺点:

  1. 当$n<12$时不能拒绝许多的候选点;

  2. 检测出来的角点不是最优的,这是因为它的效率取决于问题的排序与角点的分布;

  3. 对于角点分析的结果被丢弃了;

  4. 多个特征点容易挤在一起。

3. 使用机器学习做一个角点分类器

  1. 首先选取你进行角点提取的应用场景下很多张的测试图片。
  2. 运行FAST角点检测算法来获取测试图片集上的所有角点特征。
  3. 对于每个角点,我们把它邻域圆上的16个点存储下来保存在一个vector内,处理所有步骤2中得到的角点,并把它们存储在$P$中。
  4. 对于每一个像素点$x$,它的邻域16个像素可以用下面的判断公式分为3类: $$S_{p\to x} =\begin{cases} d,& I_{p \to x}\le I_p –t &(darker)\\ s,&I_p-t\le I_{p\to x}<I_p+t&(similar)\\b,&I_p+t\le I_{p\to x}&(brighter)\end{cases}$$
  5. 依靠这些状态,特征向量$P$,被分为3个子集,$P_d,P_s,P_b$;
  6. 定义一个新的布尔变量$K_p$,如果$p$是一个角点,那些$K_p$为值,否则为假。
  7. 使用ID3算法(决策树分类器)来查询每一个子集。
  8. 递归计算所有的子集直到它的熵为0;
  9. 被创建的决策树就用于于其他图片的FAST检测。

4. 非极大值抑制

从邻近的位置选取了多个特征点是另一个问题,我们可以使用Non-Maximal Suppression来解决。

  1. 为每一个检测到的特征点计算它的响应大小(score function)$V$。这里$V$定义为点$p$和它周围16个像素点的绝对偏差的和。
  2. 考虑两个相邻的特征点,并比较它们的$V$值。

  1. $V$值较低的点将会被删除。

FASTFeature from Accelerated Segement Test

局部检测标准通过考虑在候选点p周围的16个点来进行操作。最初的检测器将p看做角点,前提是如果在圆中存在连续的n个像素点都比(p的亮度Ip+阈值t)还亮,或者都比(Ip-t)还暗,n被选择是12,因为它允许高速测试中排除很多的非角点:(即|Ii-Ip|>T,T是阈值,Ii是检测的点的亮度(灰度))

这个测试只检验了四个点1,5,9,13即四个指南针方向,如果p是一个角点,则至少三个点是大于Ip+t或小于Ip-t。即前提检测4个点,若满足上诉条件则进一步计算其他点,若不满足则直接说明是非角点。

缺点:

1. 该方法并不适用于n<12 的情况

2. 快速测试的像素点的选择和排序包含了隐藏的关于特征分布的假想。

3. 前四次测试结果是要丢弃的

4. 很多相邻的特征点被检测出来

Machine learning a corner detector

这里我们展示了一种基于机器学习的方法来得到前三个点的结果,共分为两个过程:

为了建立一个对于给定N的角点检测器,首先,利用基于N和阈值的段测试从一组图片中检测出角点,这里使用了一种比较慢的算法,因为对于每一个点都会测试它的圆周上的16个点。对于圆周上的每一个点X{1,…16};关于P的像素点(用表示,即在P圆周上的点),有一下三种状态。

 

选择x,计算对于所有pP(即所有训练图片中的像素),P分成三个小组,Ps,Pd,Pb,

这里用了ID3的机器学习的算法,x在这里是影响分组的属性,因为我们将使用来判断该点的状态,进而分组,x的不同,其值也不同。再计算其每个x的条件熵,这里用H(p)-H(Pd)-H(Ps)-H(Pb)来表明x的信息熵,则值越大,熵越小。最后建立了基于测试集的决策树,从而建立了规则集,进而判断是否是角点。

Non-Maximal Suppression

非极大值抑制

由于FAST算法并没有给出角点的相关函数,所以不能直接判断极大值,这儿给出此处极大值的定义。

 

 


0 0