FAST角点检测算法笔记

        特征点检测的算法有很多,比如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个连续像素点的灰度值都高于I_p + t或低于I_p - t,则认为像素点p是一个角点。一般情况n = 12。

        4.前面三步需要在每个像素点上都进行,但图像中绝大多数的点都不是特征点。如果所有点都按照这样的流程走一遍效率太低。FAST算法采用了一种进行非特征点判别的方法(n = 12时):

        对p点的正上方和正下方(1,9)、正左方和正右方(13,5)像素先进行检测。

        如果(1,9)都不满足条件则不用再继续检测下去了(因为不可能再出现12个连续的点灰度值都在I_p \pm t之外了);

        如果(1,9)满足条件,再检查(13.5),如果(13,5)都不满足条件则跳过。

        这四个点中,至少要有三个点满足条件,才继续检测后续的点。

FAST算法缺点

        虽然FAST算法原理简单,检测效率很高,但它的问题也比较多:

        1. 检测出的角点较多。

        2. 依赖阈值 t 的设置,对噪声敏感。

        3. 没有方向信息,不具有旋转不变性。

        4. 检测出角点很多都是相邻的。

        对于第4个问题,可以通过非极大值抑制的方法来解决。

         这个抑制的方法原理也很简单,就是对所有候选角点确定了一个打分函数V:

        V = \sum _i^{16}|I_p - I_i| 

        V的值其实就是p点像素和圆上的16个像素值的差的绝对值加总到一起。

        对于相邻的候选角点,谁的V小就把这个点给去掉即可。

FAST(Features from Accelerated Segment Test)角点检测算法是一种用于实时图像处理的高效角点检测算法。该算法通过比较像素点与其邻域像素点的灰度值来判断该点是否为角点,从而实现快速检测角点的功能。 FAST角点检测算法的具体实现步骤如下: 1. 选择一个像素点p作为候选角点; 2. 设置一个阈值t,将p的灰度值与其邻域内所有像素的灰度值进行比较,如果p的灰度值与其中n个像素的灰度值之差都大于t,则认为该点为角点; 3. 为了避免检测到邻域内的多个像素点作为角点,需要对检测到的角点进行非极大值抑制,即只保留灰度值最大的角点。 需要注意的是,在实际应用中,需要根据图像的具体特点来调整算法的参数,以获得更好的效果。同时,FAST角点检测算法也存在一些限制,比如对噪声和图像变换的鲁棒性较差,需要结合其他算法进行增强。 以下是使用OpenCV库实现FAST角点检测算法的Python代码示例: ```python import cv2 import numpy as np img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) fast = cv2.FastFeatureDetector_create() kp = fast.detect(gray, None) img2 = cv2.drawKeypoints(img, kp, None, color=(0,255,0)) cv2.namedWindow("FAST corner detector", cv2.WINDOW_NORMAL) cv2.imshow("FAST corner detector", img2) cv2.waitKey(0) cv2.destroyAllWindows() ``` 该代码使用OpenCV库实现了FAST角点检测算法,对输入的图像进行角点检测,并将结果显示出来。其中,cv2.FastFeatureDetector_create()用于创建FAST角点检测器,kp为检测到的关键点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦枫Leonlew

希望这篇文章能帮到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值