FAST角点检测:Features From Accelerated Segment Test

FAST角点检测:Features From Accelerated Segment Test

  • 一、FAST算法原理
  • 二、FAST算法步骤
  • 三、使用机器学习做一个角点分类器
  • 四、非极大值抑制
  • 五、OpenCV中进行FAST特征检测
  • 六、小结
  • 七、源码分析
  • 八、参考文献

一、 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角点定义为:若某像素点与其周围领域内足够多的像素点处于不同的区域,则该像素点可能为角点。也就是某些属性与众不同,考虑灰度图像,即若该点的灰度值比其周围领域内足够多的像素点的灰度值大或者小,则该点可能为角点。

二、FAST算法步骤

1.从图片中选取一个像素P,下面我们将判断它是否是一个特征点。我们首先把它的亮度值设为Ip。
2.设定一个合适的阈值t
3.考虑以该像素点为中心的一个半径等于3像素的离散化的Bresenham圆,这个圆的边界上有16个像素(如图1所示)。
图1.
图1. FAST特征点示意图
4.现在,如果在这个大小为16个像素的圆上有n个连续的像素点,它们的像素值要么都比Ip+t大,要么都比Ip−t小,那么它就是一个角点。(如图1中的白色虚线所示)。n的值可以设置为12或者9,实验证明选择9可能会有更好的效果。

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

-上面的算法效率实际上是很高的,但是有点一些缺点:
1.当我们设置n<12时就不能使用快速算法来过滤非角点的点;
2.检测出来的角点不是最优的,这是因为它的效率取决于问题的排序与角点的分布;
3.多个特征点容易挤在一起。

三、使用机器学习做一个角点分类器

1.首先选取你进行角点提取的应用场景下很多张的测试图片。
2.运行FAST角点检测算法来获取测试图片集上的所有角点特征。
3.对于每个角点,我们把它邻域圆上的16个点存储下来保存在一个vector内,处理所有步骤2中得到的角点,并把它们存储在P中。
4.对于图像上的点p,它周围邻域圆上位置为x,x∈{1…16}的点表示为p→x,可以用下面的判断公式将该点p→x分为3类:
这里写图片描述
5.设P为训练图像集中所有像素点的集合,我们任意16个位置中的一个位置x,可以把集合P分为三个部分Pd,Ps和Pb,其中Pd的定义如下,Ps和Pb的定义与其类似:
Pb={p∈P:Sp→x=b};

换句话说,对于任意给定的位置x,它都可以把所有图像中的点分为三类,第一类Pd包括了所有位置x处的像素在阈值t下暗于中心像素,第二类Ps包括了所有位置x处的像素在阈值t下近似于中心像素,Pb包括了所有位置x处的像素在阈值t下亮于中心像素。
6.定义一个新的布尔变量Kp,如果p是一个角点,那些Kp为值,否则为假。
7.使用ID3算法(决策树分类器)来查询每一个子集。
8.递归计算所有的子集直到Kp的熵为0;
9.被创建的决策树就用于于其他图片的FAST检测

四、非极大值抑制

从邻近的位置选取了多个特征点是另一个问题,我们可以使用Non-Maximal Suppression来解决。
1.为每一个检测到的特征点计算它的响应大小(score function)V。这里V定义为点P可以成为角点的最大阈值t。
2.考虑3x3的MASK里9个特征点,并比较它们的V值。
3.V值较低的点将会被删除。

五、OpenCV中进行FAST特征检测

在OpenCV中进行FAST特征提取的函数为FAST。它一共有4个参数,第一个参数是输入的图像,第二个是返回的特征点,第三个是定义的阈值,第四个决定是否使用非极大值抑制。

void FAST(InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression=true )

C++: void FASTX(InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression, int type)

另外还有一个接口为FASTX,它提供了第五个参数type用来指定FAST检测中像素邻域圆的参数:TYPE_9_16、TYPE_7_12、TYPE_5_8。

#include <iostream> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/nonfree/features2d.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat img_1 = imread("IMG1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    Mat img_2 = imread("IMG3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    if (img_1.empty() || img_2.empty() )
    {
        cout << "Load image error!\n" << endl;
        return -1;
    }

    std::vector<KeyPoint> keypoints_1, keypoints_2;

    FAST(img_1, keypoints_1, 40, 1);
    FAST(img_2, keypoints_2, 40, 1);

    //-- Draw keypoints 
    Mat img_keypoints_1, img_keypoints_2;
    drawKeypoints(img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    drawKeypoints(img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    //-- Show detected (drawn) keypoints 
    imshow("Keypoints1", img_keypoints_1);
    imshow("Keypoints2", img_keypoints_2);

    //waitKey();

    // Compute feature vector
    SiftDescriptorExtractor extractor;//define descriptor object
    Mat descriptors_1, descriptors_2; //define feature vectors matrix

    extractor.compute(img_1, keypoints_1, descriptors_1);//计算特征向量
    extractor.compute(img_2, keypoints_2, descriptors_2);

    //用Flann进行匹配特征向量
    FlannBasedMatcher matcher;
    std::vector<DMatch>matches;
    matcher.match(descriptors_1, descriptors_2, matches);

    Mat img_matches;
    drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches); 
    imshow("sift_Matches", img_matches);

    waitKey(0);
    return 0;
}

这里写图片描述
图2. 两张图片用FAST角点检测子检测出来的结果图

这里写图片描述
图3.用SIFT描述子进行特征点匹配的结果

可见还是有很多特征点匹配错误了

五、小结

FAST算法比其他已知的角点检测算法要快很多倍,但是当图片中的噪点较多时,它的健壮性并不好,而且算法的效果还依赖于一个阈值t。而且FAST不产生多尺度特征,而且FAST特征点没有方向信息,这样就会失去旋转不变性。
所以作者在2010修改过的文章里[2]又提出了FAST-er,在FAST的基础上作了小的修改,增强了对高斯噪声的适应性。

六、源码分析(未完待续)

源码分析可以参见这篇博文:
http://blog.csdn.net/zhaocj/article/details/40301561

七、参考文献

[1] Edward Rosten and Tom Drummond, “Machine learning for high speed corner detection” in 9th European Conference on Computer Vision, vol. 1, 2006, pp. 430–443.

[2] Edward Rosten, Reid Porter, and Tom Drummond, “Faster and better: a machine learning approach to corner detection” in IEEE Trans. Pattern Analysis and Machine Intelligence, 2010, vol 32, pp. 105-119.

基于原文改写,原文有少量错误,转载自原文:http://www.cnblogs.com/ronny/p/4078710.html?utm_source=tuicool

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值