FAST特征点检测算法
一、FAST算法简介
如今,特征点检测的算法有很多,从最初的Moravec,到Harris,再到SIFT、SUSAN、GLOH、SURF算法,可以说特征点提取算法层出不穷。各种改进算法PCA-SIFT、ICA-SIFT、P-ASURF、R-ASURF、Radon-SIFT等也是搞得如火如荼。其中上面的算法如SIFT、SURF提取到的特征效果非常好(有较强的不变性),但是时间消耗依然很大,而在一个系统中,特征提取仅仅是一部分,还需要进行诸如配准、提纯、融合等后续算法。这使得系统的实时性变差,降系了系统性能。所以FAST算法的提出就是为了解决系统检测的实时性问题。
2006年,Edward Rosten和Tom Drummond在《Machine learning for high-speed corner detection》中提出了一种FAST特征点检测算法,并在2010年稍作修改后发表了《Features From Accelerated Segment Test》,简称FAST算法。需要强调的是FAST算法只是一种特征点检测算法,并不涉及特征点的特征描述。具体的特征点描述可以通过其它算法来实现。
二、FAST算法主要内容
1、FAST特征角点
在理解具体算法之前先了解FAST特征角点的概念,如果某点的像素与其周围邻域内足够多的其它点的像素相差较大,则该点可能是角点。
2、FAST算法实现的具体步骤如下:
(1)在图像中任选一点p, 假定其像素(亮度)值为 Ip。
(2)以p点为中心,以3为半径画圆,圆上有16个像素,如下图所示:
(3)定义一个阈值。计算p1、p9与中心p的像素差,若它们绝对值都小于阈值,则p点不可能是特征点,直接丢弃;否则,当做候选点,进行下一步判断;
(4)若p是候选点,则计算p1、p5、p9、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选点,进行下一步判断;否则,直接丢弃;
(5)若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少9个超过阈值,则是特征点;否则,直接丢弃。
(6)对图像进行非极大值抑制:判断以特征点p为中心的一个邻域(如3x3或5x5)内是否有多个特征点,如果有多个特征点,则分别计算各个特征点的FAST得分值(即s值,为16个点与中心差值的绝对值总和),如果p是领域所有特征点中s值最大的,则保留这个特征点,否则丢弃掉。如果领域内只有一个特征点,则将这个特征点进行保留,不参与别的计算。其中上面用到的得分计算公式如下(公式中用V表示得分,t表示阈值):
由上可以看出,FAST算法实现起来简单,这也就是它为什么这么快速的原因,它也因为其速度快而著称。
三、利用OpenCV实现的FAST实例
1、代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img = imread("1.jpg"); //读取图片
std::vector<KeyPoint> keypoints;
FAST(img, keypoints, 10); //调用FAST算法,10为阈值
//-- Draw keypoints
Mat img_keypoints;
drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
//-- Show detected (drawn) keypoints
imshow("Keypoints", img_keypoints);
waitKey(0);
return 0;
}
2、运行结果
(1)原图
(2)FAST特征点检测
四、总结
FAST算法比其他已知的角点检测算法要快很多倍,但是当图片中的噪点较多时,它的健壮性并不好,而且算法的效果还依赖于一个阈值tt。而且FAST不产生多尺度特征而且FAST特征点没有方向信息,这样就会失去旋转不变性。
上一篇: php使用GD库画五角星
下一篇: 请教一个简单的url重写问题