FAST角点检测方法详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljyljyok/article/details/87741725

FAST(Features from Accelerated Segment Test)由Edward Rosten和Tom Drummond在2006年首先提出,是近年来一总倍受关注的基于模板和机器学习的角点检测方法,它不仅计算速度快,还具有较高的精确度。本文将通过其2006年的原文,详细介绍FAST的基本原理。

√ FAST 角点检测是一种的快速角点特征检测算法。
√ FAST 角点定义为:若某像素点与其周围领域内足够多的像素点处于不同的区域,则该像素点可能为角点,也就是某些属性与众不同。
√ FAST特征点检测是对兴趣点所在圆周上的16个像素点进行判断,若判断后的当前中心像素点为暗或亮,将决定其是否为角点。

√ 确定一个阙值t, 观察某像素点为中心的一个半径等于3像素的离散化的圆,这个圆的边界上有16个像素。
如果在这个大小为16个像素的圆上有n(一般n为12)个连续的像素点,它们的像素值I要么都比IP+t大,要么都比Ip-t小,则p它就是一个角点。


一、FAST算法原理

FAST的方法主要是考虑像素点附近的圆形窗口上的16个像素,如下图所示,p为中心像素点,而白框标示的点像素则是我们需要考虑的点。


最初的检测方法就是检测在这样的圆环上的16个像素点中,如果有n个连续的点都比中心像素p的强度都大,或都小的话,这样的中心点就是角点,实际上比较强度时,需要加上阈值t。


上图的公式说明了这一过程,一般情况下,n是取12,所以这个标准定义为FAST-12,而实际上当n=9时,往往能取得较好的效果。


如果要提高检测速度的话,只需要检测四个点就可以了,首先比较第1和第9个像素,如果两个点像素强度都在中心像素强度t变化范围内(及都同中心点相似),则说明这不是角点,如果接下来检测第5和13点时,发现上述四点中至少有三个点同中心点不相似,则可以说明这是个角点。之后为了提高精度,我们还可以对上面运算后的剩下的候选角点进行全部的16点检测,从而确定其是不是角点。

然后这个方法也有如下的几个缺点:

(1)如果在首先的四点检测里,只有2个点同中心点不相似,也并不能说明这不是角点。

(2)检测的效率严重依赖于检测点的顺序和角点附近的分布,很难说明所选择比较的像素位置能最好的反应角点性能。

(3)前面的四点检测结果没能充分用到后面检测上来。

(4)并连在一起的特征点很可能检测到了相邻的位置。

所以,为了解决上述问题,接下来,本文将重点介绍FAST算法最为精髓的地方——通过机器学习来改善速度和通用性。

 

二、机器学习改善速度及通用性

通过机器学习的方法,我们可以解决上面提到的前三个问题,而第四个问题可以通过非极大值抑制来解决(之后会介绍)。机器学习方法采用的是决策树方法,通过对像素点进行分类,找到角点附近的16点位置中最能区分这个分类的位置(实际上就指决策树每层的根),而叶则用来指明是否是角点。其主要分为两个部分,首先给定n,对所以的16像素圆环建立FAST-n检测,然后从一组图像内(最好是同目标图像相似)提取大量的角点。

(1)对于这个16个像素的每个位置x[1,16],将其同中心像素比较,获得三个状态,如下


选择一个位置x,将所有训练图像中的所以像素点(记为集P)同其该位置点进行上述等式比较,分别计算每点的状态 ,由此以来,对于每个位置x,我们都可以都得到一个状态集,而每个状态就是指一个像素(集P内的每个像素)同其附近(圆环上)该位置像素的状态。

(2)然后我们选择一个x位置的状态集,可以将集P内的像素点根据其在状态集对应位置上状态,分成三个部分,其意思是指该子集内的像素,其附近圆环x位置的像素同比较,是更暗(d集),相似(s集)或更亮(b)。

(3)之后再定义一个布尔变量来确定当前像素点p是否是角点。对于任意一个点集Q,我们可以计算总共的熵值:


对于一个位置x来说,它分类的信息量为:


(4)接下来,我们就是选择信息量最大的x位置,同时在其下面的子集内继续迭代选择信息量最大的x位置(每个子集内选择x位置可以分别写成xd,xs,xb),然后继续将子集再次分割,如将。每一次分割所选的x都是通将集分类成拥有最大信息量的位置。

为什么要是最大信息量的位置呢?最大信息量表明分成的子集的信息量最少,也就意味着子集内的点都是具有相同类似的点(即都是角点,或都不是角点),所以最后我们将通过训练集得到一个决策树,其能将像素点较好的区分是否是角点。下图是决策树模型。


(5)为了更好的优化,我们强制让xd,xs,xb相等,这样的话,我们选择第二个测试的位置点将会一样,只需要两个位置点的比较,我们就能排除绝大多数的点,如此以来将让速度大大提高。

 

三、非极大值抑制

因为FAST方法没有计算角响应度,所以我们很难采用常规的方法来直接进行非极大值抑制,对于一个给定的n,如果阈值t增加,那么检测的角点数将会减少,因为角点强度可以被定义为如果这个点可以被检测成角点时,t所能取到的最大值。

决策树能根据一个给定的t,非常高效的确定一个点是否是角点,由此以来,我们可以通过变化t,来确定找到该点由角点变为非角点时的t值,而这个t值就是让该点检测为角点的最大阈值,这个查找方法可以用二分法的解决。或者,我们也可以用一个迭代的方法。

找到了角响应度的衡量后,我们就可以应用原来的非极大值抑制方法了,最终得到我们想要的角点。

总结

FAST算法比其他已知的角点检测法要快很多倍。
但是当图片的噪点较多时,它的健壮性并不好。这依靠一个阙值。

优缺点

(优) FAST角点检测计算的时间复杂度小,检测效果好,效率高/快速。
(缺) FAST不产生多尺度特征,也没有方向信息,这样就会失去旋转不变性。

OpenCV中的FAST特征检测

和OpenCV中其他特征检测器的调用相同。如果你想,你可以指定一个阙值,或者决定是否使用non-maximal suppression来判断邻近特征点。

对于相邻特征点,OpenCV定义了三个flags:
cv2.FAST_FEATURE_DETECTOR_TYPE_5_8
cv2.FAST_FEATURE_DETECTOR_TYPE_7_12
cv2.FAST_FEATURE_DETECTOR_TYPE_9_16

sample:

import numpy as np
import cv2
from matplotlib import pyplot as plt
 
img = cv2.imread('simple.jpg',0)
 
# Initiate FAST object with default values
fast = cv2.FastFeatureDetector()
 
# find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv2.drawKeypoints(img, kp, color=(255,0,0))
 
# Print all default params
print "Threshold: ", fast.getInt('threshold')
print "nonmaxSuppression: ", fast.getBool('nonmaxSuppression')
print "neighborhood: ", fast.getInt('type')
print "Total Keypoints with nonmaxSuppression: ", len(kp)
 
cv2.imwrite('fast_true.png',img2)
 
# Disable nonmaxSuppression
fast.setBool('nonmaxSuppression',0)
kp = fast.detect(img,None)
 
print "Total Keypoints without nonmaxSuppression: ", len(kp)
 
img3 = cv2.drawKeypoints(img, kp, color=(255,0,0))
 
cv2.imwrite('fast_false.png',img3)


下面是测试结果。左边是使用了nonmaxSuppression的FAST,右边则没有使用。
在这里插入图片描述

 

参考文献

Machine Learning for High-Speed CornerDetection

猜你喜欢

转载自blog.csdn.net/ljyljyok/article/details/87741725