FAST 角点检测
FAST 是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。它的思想是: 如果一个像素与它邻域的像素差别较大(过亮或过暗), 那它更可能是角点。相比于其他角点检测算法,FAST 只需比较像素亮度的大小, 十分快捷。它的检测过程如下:
- 在图像中选取像素 p,假设它的亮度为 C,并设置一个阈值 T。
- 以像素 p 为中心, 选取半径为 3 的圆上的 16 个像素点(如上图所示)。
def circle(row,col): |
- 假如这 16 个点中,有连续的 N 个点的亮度大于 C + T 或小于 C − T,那么像素 p 可以被认为是角点。
- 为了排除大量的非角点提出了一种高速测试方法:直接检测邻域圆上的第 1,5,9,13 个像素的亮度。只有当这四个像素中有三个同时大于 C + T 或小于 C − T 时,当前像素才有可能是一个角点,否则应该直接排除。这样的预测试操作大大加速了角点检测。
def is_corner(image,row,col,threshold): |
- 在第一遍检测后,原始的 FAST 角点经常出现“扎堆”的现象。因此需要使用非极大值抑制,在一定区域内仅保留响应极大值的角点,避免角点集中的问题。
第一张图片使用了非最大值抑制,而第二张没有使用。可以明显看到,第二张图的关键点的位置重复比较严重。
为了方便,我们可以在 OpenCV 里直接创建 FAST 特征点检测器并使用它:
import cv2 |
参考文献: