Fast特征点检测

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所示)。

    图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. 对于图像上的点$p$,它周围邻域圆上位置为$x,x\in\{1\dots16\}$的点表示为$p\to x$,可以用下面的判断公式将该点$p\to x$分为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$为训练图像集中所有像素点的集合,我们任意16个位置中的一个位置$x$,可以把集合$P$分为三个部分$P_d,P_s$和$P_b$,其中$P_d$的定义如下,$P_s$和$P_b$的定义与其类似$$P_b=\{p\in P:S_{p\to x} = b\}$$ 换句话说,对于任意给定的位置$x$,它都可以把所有图像中的点分为三类,第一类$P_d$包括了所有位置$x$处的像素在阈值$t$下暗于中心像素,第二类$P_s$包括了所有位置$x$处的像素在阈值$t$下近似于中心像素,$P_b$包括了所有位置$x$处的像素在阈值$t$下亮于中心像素。
  6. 定义一个新的布尔变量$K_p$,如果$p$是一个角点,那些$K_p$为值,否则为假。
  7. 使用ID3算法(决策树分类器)来查询每一个子集。
  8. 递归计算所有的子集直到$K_p$的熵为0;
  9. 被创建的决策树就用于于其他图片的FAST检测。

4. 非极大值抑制

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

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

5. 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 <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("box.png");
    std::vector<KeyPoint> keypoints;
    FAST(img, keypoints, 20);
    //-- 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;
}

   

6. 总结

FAST算法比其他已知的角点检测算法要快很多倍,但是当图片中的噪点较多时,它的健壮性并不好,而且算法的效果还依赖于一个阈值$t$。而且FAST不产生多尺度特征而且FAST特征点没有方向信息,这样就会失去旋转不变性。

[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.

时间: 2024-11-08 17:43:01

Fast特征点检测的相关文章

OpenCV中feature2D学习——FAST特征点检测

在前面的文章<OpenCV中feature2D学习--SURF和SIFT算子实现特征点检测>中讲了利用SIFT和SURF算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测. FAST的全名是:Features from Accelerated Segment Test,主要特点值计算速度快,比已知的其他特征点检测算法要快很多倍,可用于计算机视觉应用的实时场景.目前以其高计算效率(computational performance).高可重复性(highrepeatability)成为

OpenCV2马拉松第26圈——FAST特征点检测

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28424579 关于角点检测,我写过两篇文章 openCV2马拉松第19圈--Harris角点检测(自己实现) OpenCV2马拉松第21圈--形态学操作实现角点检测 有兴趣的童鞋可以去看看--- 收入囊中 FAST角点检测原理 使用OpenCV  FAST API检测角点 葵花宝典 对于一个角点来说,应该与周围的大多数像素点有很大的差别 如上图,

OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配

在前面的文章<OpenCV中feature2D学习--FAST特征点检测>中讲了利用FAST算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测,并结合SIFT/SURF/BRIEF算子进行特征点提取和匹配. I.结合SIFT算子进行特征点提取和匹配 由于数据类型的不同,SIFT和SURF算子只能采用FlannBasedMatcher或者BruteForceMatcher来进行匹配(参考OpenCV中feature2D学习--BFMatcher和FlannBasedMatcher).

ORB特征点检测

Oriented FAST and Rotated BRIEF 这篇文章我们将介绍一种新的具有局部不变性的特征 —— ORB特征,从它的名字中可以看出它是对FAST特征点与BREIF特征描述子的一种结合与改进,这个算法是由Ethan Rublee,Vincent Rabaud,Kurt Konolige以及Gary R.Bradski在2011年一篇名为“ORB:An Efficient Alternative to SIFT or SURF”的文章中提出.就像文章题目所写一样,ORB是除了SI

OpenCV2学习笔记(十一):特征点检测之FAST算法

在上一节中,记录了Harris算子检测图像特征点的定义和基于OpenCV的实现方法,它基于两个正交方向上的强度变化率.本节记录另一种特征点检测算子FAST(Features from Accelerated Segment Test),它依赖少数像素的比较来确定是否接受一个特征点,其检测效率要好于Harris. 与Harris算法相同,FAST特征算法需要定义什么是特征点.这次的定义基于假定特征点周围的图像强度,通过检查候选像素的周围一圈像素来决定是否接受这一个特征点.与中心点差异较大的像素如果

【OpenCV入门教程之十七】OpenCV重映射 &amp; SURF特征点检测合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

OpenCV特征点检测------ORB特征

OpenCV特征点检测------ORB特征 ORB是是ORiented Brief的简称.ORB的描述在下面文章中: Ethan Rublee and Vincent Rabaud and Kurt Konolige and Gary Bradski, ORB: an efcient alternative to SIFT or SURF, ICCV 2011 没有加上链接是因为作者确实还没有放出论文,不过OpenCV2.3RC中已经有了实现,WillowGarage有一个talk也提到了这个

Emgucv使用Harris角点检测和Fast角点检测

角点是两个边缘的连接点,代表了两个边缘变化的方向上的点,在这点上图像梯度有很高的变化.是图像中的重要特征点.在opencv中还有改进版的Harris角点检测:Shi-Tomasi 角点检测算法,但在Emgucv里并没有封装,所以目前无法直接使用. 一.Harris角点检测 Harris角点检测通过判断点在水平和竖直方向上的变化程度来判断是否为角点,使用CornerHarris函数,处理后再用阈值来判断是否为角点. public partial class Form1 : Form { publi

OpenCV入门教程之九 特征点检测与图像匹配

特征点又称兴趣点.关键点,它是在图像中突出且具有代表意义的一些点,通过这些点我们可以用来识别图像.进行图像配准.进行3D重建等.本文主要介绍OpenCV中几种定位与表示关键点的函数. 一.Harris角点 角点是图像中最基本的一种关键点,它是由图像中一些几何结构的关节点构成,很多都是线条之间产生的交点.Harris角点是一类比较经典的角点类型,它的基本原理是计算图像中每点与周围点变化率的平均值.  (1)  (2) 其中I(x+u,y+u)代表了点(x,y)邻域点的灰度值.通过变换可以将上式变化