特征点检测的算法有很多,比如Moravec、Harris、SIFT、SUSAN、GLOH、SURF等算法。还有各种改进算法如PCA-SIFT、ICA-SIFT、P-ASURF、R-ASURF、Radon-SIFT等。在前面的笔记中所提到过的SIFT算法提取到的特征效果非常好(旋转不变、尺度不变等特性),但是其计算量过大,性能开销太大。在实际系统应用时,特征提取仅仅其中比较基本的一小部分,后续还需要进行诸如配准、提纯、融合等后续算法。因此在实时性要求高的系统中需要效率较高的检测算法。
2006年Edward Rosten和Tom Drummond在《Machine learning for high-speed corner detection》中提出了一种FAST特征点检测算法,并在2010年稍作修改后发表了《Features From Accelerated Segment Test》,简称FAST算法。需要强调的是FAST算法只是一种特征点检测算法,并不涉及特征点的特征描述。具体的特征点描述可以通过其它算法来实现。
FAST简介
FAST算法是一种用于角点检测的算法,全称是Fetures from Accelerated Segment Test。该算法的原理是提取图像中的监测点,以该点为圆心的一定范围内的像素点来检测判断点是否为角点。直白的理解是一个像素点周围如果有一定数量的像素点与该点像素值差别较大,则认为其是角点。
FAST算法流程
1. 在图像中选择一个像素点p(Ip为其灰度值)。
2. 以p点为圆心,r为半径画圆,圆覆盖周围的M个像素。一般情况下,r = 3,此时M=16。
3. 设置阈值t,如果这16个像素点中存在n个连续像素点的灰度值都高于或低于,则认为像素点p是一个角点。一般情况n = 12。
4.前面三步需要在每个像素点上都进行,但图像中绝大多数的点都不是特征点。如果所有点都按照这样的流程走一遍效率太低。FAST算法采用了一种进行非特征点判别的方法(n = 12时):
对p点的正上方和正下方(1,9)、正左方和正右方(13,5)像素先进行检测。
如果(1,9)都不满足条件则不用再继续检测下去了(因为不可能再出现12个连续的点灰度值都在之外了);
如果(1,9)满足条件,再检查(13.5),如果(13,5)都不满足条件则跳过。
这四个点中,至少要有三个点满足条件,才继续检测后续的点。
FAST算法缺点
虽然FAST算法原理简单,检测效率很高,但它的问题也比较多:
1. 检测出的角点较多。
2. 依赖阈值 t 的设置,对噪声敏感。
3. 没有方向信息,不具有旋转不变性。
4. 检测出角点很多都是相邻的。
对于第4个问题,可以通过非极大值抑制的方法来解决。
这个抑制的方法原理也很简单,就是对所有候选角点确定了一个打分函数V:
V的值其实就是p点像素和圆上的16个像素值的差的绝对值加总到一起。
对于相邻的候选角点,谁的V小就把这个点给去掉即可。