FAST角点检测算法 概念+原理+实现 掌握100种计算机视觉技术算法系列 获取10000+计算机视觉技术PDF
前言 概念 原理 步骤 效果 生成测试图片实现 FAST角点检测算法 总结
前言
FAST(Features from Accelerated Segment Test)角点检测算法专门针对实时应用场景设计。该算法通过高效的角点判断机制,在保证检测精度的同时大幅提升处理速度,成为移动设备和实时系统中广泛使用的特征检测方法之一。FAST算法的核心思想是围绕候选像素的圆形邻域进行快速比较,通过统计连续像素的强度变化来判断角点特征。
博客作者微信公众号(计算机视觉技术)集中收录了100种计算机视觉技术算法,每一种算法都具体介绍了概念、原理、步骤、运行效果,以及完整的源码实现,您可以据此系统全面掌握计算机视觉技术算法。
关注微信公众号"计算机视觉技术”,系统掌握100种计算机视觉技术算法。 微信公众号提供获取10000+计算机视觉技术最新技术PDF的URL链接和获取PDF的脚本工具。实际体验亲测稳定可靠。
计算机视觉技术算法 概念+原理+实现
微信视频号:计算机视觉技术
微信公众号:计算机视觉技术
感谢您的关注!
概念
角点通常被定义为图像中梯度变化剧烈的区域,在多个方向上都具有显著的强度变化。FAST算法采用了一种不同的角点定义方式:围绕候选像素的圆形邻域中,如果存在连续的像素点都明显比中心像素亮或暗,则认为该像素是角点。这种定义方式直接基于像素强度的相对比较,避免了复杂的梯度计算,从而大幅提升了处理速度。
FAST算法中常用的参数是圆周上16个采样点和连续9个或12个像素点的判断阈值。16个采样点位于以候选像素为中心、半径为3像素的圆周上,这些点构成了算法进行强度比较的基础。连续点数的设置影响检测的严格程度,数值越大,角点检测的阈值越高,检测到的角点数量越少但质量更高。
原理
FAST算法的原理基于两个核心机制:加速测试和非极大值抑制。加速测试通过先检查圆周上等距分布的四个关键点(0、4、8、12位置)来快速排除大量非角点像素。只有当这四个点中有至少三个点满足强度条件(比中心点明显亮或暗)时,才会进行完整的16点检测。这种两阶段的测试策略有效减少了计算量,是FAST算法高效性的关键。
完整测试阶段遍历圆周上的全部16个点,统计连续满足强度条件的像素数量。如果连续满足条件的像素数量达到或超过阈值(通常为9或12),则判定该像素为角点。算法分别统计连续比中心点亮和连续比中心点暗的情况,取两者的最大值作为角点的响应分数,这个分数反映了该角点的显著性程度。
非极大值抑制是角点检测中常用的后处理步骤。由于FAST算法可能在角点附近检测到多个候选点,需要在局部邻域中选择响应最强的点作为最终角点,抑制其他较弱的响应。这一步骤避免了角点的重复检测和密集聚集,提高了角点分布的均匀性和检测结果的可靠性。
步骤
FAST角点检测算法的实现步骤包括以下几个环节:
首先需要获取圆周上16个采样点的偏移量坐标。这通过几何计算完成,将圆周均匀分为16等份,每个采样点与中心像素的水平和垂直偏移量被预先计算并存储。这些偏移量在后续的像素访问中会被反复使用,避免了重复计算。
图像预处理阶段将彩色图像转换为灰度图像。角点检测通常在灰度空间进行,这样可以简化计算并避免颜色信息的干扰。转换后得到一个单通道的灰度矩阵,每个元素代表对应像素的亮度值。
主检测循环遍历图像中的每个像素,跳过边界区域以避免索引越界。对每个候选像素,首先执行加速测试,检查四个关键采样点的强度是否与中心像素存在显著差异。如果四个点中至少有三个点满足强度条件,则进入完整测试阶段。
完整测试遍历全部16个采样点,统计连续满足强度条件的像素数量。算法维护两个计数器,分别记录连续比中心点亮和连续比中心点暗的像素数。每当遇到不满足条件的像素时,相应计数器归零,重新开始计数。记录下最大的连续数量作为该候选点的响应分数。
满足连续点数阈值的候选点被收集到角点列表中,同时保存它们的响应分数。检测完成后,应用非极大值抑制处理。按照响应分数对角点进行排序,从高到低依次保留每个角点,并抑制其邻域内的其他角点。最终得到分布均匀且响应显著的角点集合。
效果
FAST角点检测结果
测试图片中包含了多种几何形状,包括三角形、正方形、五边形、六边形、五角星、八边形、菱形、小三角形和平行四边形。FAST算法成功检测到这些形状的所有角点,包括尖锐的顶角和内部的转折点。角点被标记为红色圆点,准确标识出图像中梯度变化剧烈的区域。
算法在处理各种类型的角点时表现出良好的适应性。对于三角形和小三角形等具有尖锐顶角的形状,角点被准确识别。对于五边形、六边形、八边形、菱形和平行四边形等多边形,算法能够检测到所有的顶角。对于五角星的复杂轮廓,算法同样能够识别出所有的角点。这些检测结果验证了FAST算法在不同场景下的有效性和鲁棒性。
生成测试图片源码
测试图片生成程序创建了一个包含多种几何形状的合成图像。程序首先创建一个白色背景的画布,然后在画布上绘制黑色形状。每个形状通过定义其顶点坐标来生成,使用填充多边形函数和绘制多边形轮廓函数来实现。形状的轮廓线条被设置为5像素宽,所有形状使用黑色(0, 0, 0)填充以增强与白色背景的对比度。
程序在画布上依次绘制了三角形、正方形、五边形、六边形、五角星、八边形、菱形、小三角形和平行四边形。这些形状分布在画布的不同区域,便于区分。最后程序在距离底部200像素的位置居中显示"BUTIANYUN.COM"文字,使用黑色粗体字体。整个测试图片的设计目的是提供丰富的角点信息,以充分展示FAST角点检测算法的性能。
############################################################
# 微信公众号:计算机视觉技术
# 微信视频号:计算机视觉技术
# 网站 :BUTIANYUN.COM
############################################################
import numpy as np
import cv2
def create_test_image(height=400, width=800):
"""
创建FAST角点检测算法的测试图片
参数:
height: 图片高度
width: 图片宽度
返回:
测试图片
"""
# 创建白色背景
image = np.ones((height, width, 3), dtype=np.uint8) * 255
# 绘制三角形 - 左上角
triangle_points = np.array([
[100, 80],
[60, 140],
[140, 140]
], dtype=np.int32)
cv2.fillConvexPoly(image, triangle_points, (0, 0, 0))
cv2.polylines(image, [triangle_points], True, (0, 0, 0), 5)
# 绘制正方形 - 中上
square_points = np.array([
[250, 60],
[350, 60],
[350, 160],
[250, 160]
], dtype=np.int32)
cv2.fillConvexPoly(image, square_points, (0, 0, 0))
cv2.polylines(image, [square_points], True, (0, 0, 0), 5)
# 绘制五边形 - 右上
center_x, center_y = 500, 110
radius = 50
pentagon_points = []
for i in range(5):
angle = 2 * np.pi * i / 5 - np.pi / 2
x = int(center_x + radius * np.cos(angle))
y = int(center_y + radius * np.sin(angle))
pentagon_points.append([x, y])
pentagon_points = np.array(pentagon_points, dtype=np.int32)
cv2.fillConvexPoly(image, pentagon_points, (0, 0, 0))
cv2.polylines(image, [pentagon_points], True, (0, 0, 0), 5)
# 绘制六边形 - 左中
center_x, center_y = 100, 250
radius = 50
hexagon_points = []
for i in range(6):
angle = 2 * np.pi * i / 6
x = int(center_x + radius * np.cos(angle))
y = int(center_y + radius * np.sin(angle))
hexagon_points.append([x, y])
hexagon_points = np.array(hexagon_points, dtype=np.int32)
cv2.fillConvexPoly(image, hexagon_points, (0, 0, 0))
cv2.polylines(image, [hexagon_points], True, (0, 0, 0), 5)
# 绘制五角星 - 中中
center_x, center_y = 300, 250
outer_radius = 55
inner_radius = 25
star_points = []
for i in range(10):
angle = 2 * np.pi * i / 10 - np.pi / 2
radius = outer_radius if i % 2 == 0 else inner_radius
x = int(center_x + radius * np.cos(angle))
y = int(center_y + radius * np.sin(angle))
star_points.append([x, y])
star_points = np.array(star_points, dtype=np.int32)
cv2.fillConvexPoly(image, star_points, (0, 0, 0))
cv2.polylines(image, [star_points], True, (0, 0, 0), 5)
# 绘制八边形 - 右中
center_x, center_y = 500, 250
radius = 50
octagon_points = []
for i in range(8):
angle = 2 * np.pi * i / 8
x = int(center_x + radius * np.cos(angle))
y = int(center_y + radius * np.sin(angle))
octagon_points.append([x, y])
octagon_points = np.array(octagon_points, dtype=np.int32)
cv2.fillConvexPoly(image, octagon_points, (0, 0, 0))
cv2.polylines(image, [octagon_points], True, (0, 0, 0), 5)
# 绘制菱形 - 左下
diamond_points = np.array([
[100, 350],
[120, 330],
[140, 350],
[120, 370]
], dtype=np.int32)
cv2.fillConvexPoly(image, diamond_points, (0, 0, 0))
cv2.polylines(image, [diamond_points], True, (0, 0, 0), 5)
# 绘制小三角形 - 中下
small_triangle_points = np.array([
[280, 330],
[260, 370],
[300, 370]
], dtype=np.int32)
cv2.fillConvexPoly(image, small_triangle_points, (0, 0, 0))
cv2.polylines(image, [small_triangle_points], True, (0, 0, 0), 5)
# 绘制平行四边形 - 右下
parallelogram_points = np.array([
[460, 330],
[500, 330],
[520, 370],
[480, 370]
], dtype=np.int32)
cv2.fillConvexPoly(image, parallelogram_points, (0, 0, 0))
cv2.polylines(image, [parallelogram_points], True, (0, 0, 0), 5)
# 添加文字
font = cv2.FONT_HERSHEY_SIMPLEX
text = "BUTIANYUN.COM"
font_scale = 1.0
thickness = 3
# 计算文字宽度以居中显示
text_size = cv2.getTextSize(text, font, font_scale, thickness)[0]
text_x = (width - text_size[0]) // 2
text_y = height - 200 + text_size[1] // 2
cv2.putText(image, text, (text_x, text_y), font, font_scale, (0, 0, 0), thickness, cv2.LINE_AA)
return image
def main():
# 生成测试图片
image = create_test_image(height=400, width=800)
# 保存测试图片
output_file = 'butianyun_computer_vision_input.png'
cv2.imwrite(output_file, image)
print(f"测试图片已生成: {output_file}")
print("图片尺寸: 800x400")
if __name__ == "__main__":
main()
关注微信公众号"计算机视觉技术”,系统掌握100种计算机视觉技术算法。 微信公众号提供获取10000+计算机视觉技术最新技术PDF的URL链接和获取PDF的脚本工具。实际体验亲测稳定可靠。
具体算法实现源码
FAST角点检测算法的实现包含了完整的检测流程和可视化功能。程序首先定义了获取圆周采样点偏移量的函数,通过三角函数计算16个等分点的坐标偏移。主检测函数接收图像、阈值、连续点数和圆周半径等参数,返回检测到的角点列表和对应的响应分数。
图像预处理阶段将灰度图像转换为int16类型,避免uint8类型在像素值相加时发生溢出。程序实现了两阶段的测试机制。加速测试阶段检查圆周上四个关键方向的像素强度,要求同一方向至少三个点满足条件。只有通过加速测试的像素才会进入完整测试阶段,这一阶段统计圆周上连续满足强度条件的像素数量。程序分别处理比中心点亮和比中心点暗两种情况,记录最大连续数量作为响应分数。
非极大值抑制函数按照响应分数对角点排序,从高到低依次保留角点并抑制其邻域内的其他角点。该函数使用一个标记数组记录被抑制的角点,确保每个局部邻域只保留响应最强的角点。窗口大小参数控制抑制的范围,可以根据实际需求调整。
可视化函数在图像上绘制检测到的角点,使用红色圆形标记每个角点位置。主程序读取输入图像,使用threshold=3和n=4参数执行角点检测和非极大值抑制,然后将结果保存到输出文件。程序还使用matplotlib库生成原始图像和检测结果的对比例图,显示并保存结果。
# FAST角点检测算法通过围绕候选像素的圆形邻域比较像素强度来快速识别角点特征。
# 算法在像素周围圆周上选取16个样本点,通过统计连续强于或弱于中心像素的点数来判断角点。
# 包含加速测试机制,先检查四个等距点,满足条件后再全面检测。
# 最后应用非极大值抑制得到最终角点,在保证检测精度的同时大幅提升计算效率。
############################################################
# 微信公众号:计算机视觉技术
# 微信视频号:计算机视觉技术
# 网站 :BUTIANYUN.COM
############################################################
import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def get_circle_offsets(radius=3):
"""
获取圆周上16个点的偏移量
"""
offsets = []
for i in range(16):
angle = 2 * np.pi * i / 16
x = int(round(radius * np.cos(angle)))
y = int(round(radius * np.sin(angle)))
offsets.append((x, y))
return offsets
def fast_corner_detection(image, threshold=20, n=9, radius=3):
"""
FAST角点检测算法实现
参数:
image: 输入图像
threshold: 强度差阈值
n: 连续点数量阈值(通常为9或12)
radius: 圆周半径
返回:
corners: 角点列表,每个元素为(y, x)坐标
"""
# 转换为灰度图像
if len(image.shape) == 3:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
else:
gray = image.copy()
# 转换为int16避免uint8溢出
gray = gray.astype(np.int16)
height, width = gray.shape
offsets = get_circle_offsets(radius)
# 获取加速测试用的四个点的索引(0, 4, 8, 12对应圆周的四个方向)
test_indices = [0, 4, 8, 12]
corners = []
scores = []
# 遍历图像,跳过边界
margin = radius + 1
for y in range(margin, height - margin):
for x in range(margin, width - margin):
center_intensity = gray[y, x]
# 加速测试:检查四个方向
brighter_count = 0
darker_count = 0
for idx in test_indices:
ox, oy = offsets[idx]
intensity = gray[y + oy, x + ox]
if intensity > center_intensity + threshold:
brighter_count += 1
elif intensity < center_intensity - threshold:
darker_count += 1
# 如果四个方向中至少有3个满足同一方向条件,才进行完整测试
if brighter_count >= 3 or darker_count >= 3:
# 完整测试:检查所有16个点
consecutive_brighter = 0
consecutive_darker = 0
max_consecutive = 0
for i in range(16):
ox, oy = offsets[i]
intensity = gray[y + oy, x + ox]
if intensity > center_intensity + threshold:
consecutive_brighter += 1
consecutive_darker = 0
elif intensity < center_intensity - threshold:
consecutive_darker += 1
consecutive_brighter = 0
else:
consecutive_brighter = 0
consecutive_darker = 0
max_consecutive = max(max_consecutive, consecutive_brighter, consecutive_darker)
if max_consecutive >= n:
corners.append((y, x))
# 使用连续点的最大数量作为分数
scores.append(max_consecutive)
return corners, scores
def non_max_suppression(corners, scores, image_shape, window_size=3):
"""
非极大值抑制
参数:
corners: 角点列表
scores: 角点分数列表
image_shape: 图像尺寸
window_size: 抑制窗口大小
返回:
保留的角点索引
"""
if len(corners) == 0:
return []
height, width = image_shape[:2]
suppressed = np.zeros(len(corners), dtype=bool)
keep_indices = []
# 按分数排序
sorted_indices = np.argsort(scores)[::-1]
for idx in sorted_indices:
if suppressed[idx]:
continue
y, x = corners[idx]
keep_indices.append(idx)
# 抑制相邻角点
for i in range(len(corners)):
if suppressed[i]:
continue
cy, cx = corners[i]
if abs(cy - y) <= window_size and abs(cx - x) <= window_size:
suppressed[i] = True
return keep_indices
def visualize_corners(image, corners, color=(0, 0, 255), radius=3):
"""
在图像上绘制角点
参数:
image: 输入图像
corners: 角点列表
color: 绘制颜色(BGR)
radius: 标记半径
返回:
标记后的图像
"""
result = image.copy()
for corner in corners:
y, x = corner
cv2.circle(result, (x, y), radius, color, -1)
return result
def main():
# 读取图像
image = cv2.imread('butianyun_computer_vision_input.png')
if image is None:
print("无法读取图像文件!")
return
# FAST角点检测
corners, scores = fast_corner_detection(image, threshold=3, n=4)
print(f"检测到 {len(corners)} 个角点")
# 非极大值抑制
keep_indices = non_max_suppression(corners, scores, image.shape)
final_corners = [corners[i] for i in keep_indices]
print(f"非极大值抑制后保留 {len(final_corners)} 个角点")
# 可视化
result = visualize_corners(image, final_corners, color=(0, 0, 255), radius=3)
# 保存结果
cv2.imwrite('butianyun_computer_vision_output.png', result)
print("结果已保存为 butianyun_computer_vision_output.png")
# 对照显示
fig, axes = plt.subplots(2, 1, figsize=(800/100, 10))
axes[0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
axes[0].set_title('原始图像', fontsize=14, pad=10)
axes[0].axis('off')
axes[1].imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
axes[1].set_title('FAST角点检测结果 (红色标记)', fontsize=14, pad=10)
axes[1].axis('off')
plt.tight_layout(pad=2.0)
# 保存显示结果
output_file = 'FAST 角点检测算法.png'
plt.savefig(output_file, dpi=100, bbox_inches='tight')
plt.show()
plt.close()
print(f"对照显示结果已保存为 {output_file}")
if __name__ == "__main__":
main()
总结
FAST角点检测算法通过围绕候选像素的圆形邻域进行像素强度比较,实现了高效快速的角点特征检测。算法的核心创新在于引入加速测试机制,先检查四个关键方向快速排除非角点,再进行完整的16点检测,大幅降低了计算复杂度。算法能够实现实时处理。FAST算法在移动设备和实时系统等场景中得到广泛应用。
计算机视觉技术算法 概念+原理+实现
微信视频号:计算机视觉技术
微信公众号:计算机视觉技术
感谢您的关注!
关注微信公众号"计算机视觉技术”,系统掌握100种计算机视觉技术算法。
01均值滤波算法
02高斯滤波算法
03中值滤波算法
04双边滤波算法
05引导滤波算法
06直方图均衡化算法
07自适应直方图均衡化算法
08限制对比度自适应直方图均衡化算法
09伽马校正算法
10对数变换算法
11线性变换算法
12高斯噪声去除算法
13直方图匹配算法
14椒盐噪声去除算法
15脉冲噪声滤波算法
16图像灰度化算法
17形态学腐蚀算法
18形态学膨胀算法
19色彩量化算法
20颜色空间转换算法
21形态学开运算算法
22形态学闭运算算法
23顶帽变换算法
24底帽变换算法
25图像旋转算法
26图像缩放算法
27图像裁剪算法
28图像镜像翻转算法
29图像金字塔构建算法
30图像去雾暗通道先验算法
31FAST角点检测算法
32ORB特征提取与描述算法
33Shi-Tomasi角点检测算法
34SIFT特征提取与描述算法
35SURF特征提取与描述算法
36Harris角点检测算法
37BRISK特征提取与描述算法
38BRIEF特征描述算法
39FREAK特征描述算法
40Sobel边缘检测算法
41Prewitt边缘检测算法
42Roberts边缘检测算法
43Canny边缘检测算法
44Laplacian边缘检测算法
45LOG边缘检测算法
46方向梯度直方图特征提取算法
47局部二值模式特征提取算法
48中心对称局部二值模式特征提取算法
49局部相位量化特征提取算法
50形态学骨架提取算法
51尺度不变特征变换算法
52离散余弦变换特征提取算法
53最大稳定极值区域检测算法
54极值稳定区域检测算法
55简单线性迭代聚类算法
56选择性搜索区域推荐算法
57密集特征提取算法
58傅里叶变换特征提取算法
59Gabor滤波器特征提取算法
60阈值分割全局阈值算法
61阈值分割迭代阈值算法
62阈值分割最大类间方差算法
63区域生长分割算法
64区域分裂与合并分割算法
65分水岭分割算法
66活动轮廓模型分割算法
67基于图割的图像分割算法
68水平集图像分割算法
69梯度矢量流活动轮廓分割算法
70K-Means聚类图像分割算法
71模糊C均值聚类图像分割算法
72谱聚类图像分割算法
73均值漂移图像分割算法
74条件随机场图像分割算法
75马尔可夫随机场图像分割算法
76实例分割掩码生成算法
77超像素分割SLIC算法
78滑动窗口目标检测算法
79积分图目标检测算法
80级联分类器目标检测算法
81交并比计算算法
82非极大值抑制算法
83卡尔曼滤波目标跟踪算法
84粒子滤波目标跟踪算法
85均值漂移目标跟踪算法
86连续自适应均值漂移目标跟踪算法
87相关滤波目标跟踪算法
88核相关滤波目标跟踪算法
89判别相关滤波目标跟踪算法
90多目标跟踪匈牙利匹配算法
91多目标跟踪余弦距离匹配算法
92基于特征的图像配准算法
93基于区域的图像配准算法
94RANSAC图像配准算法
95同态滤波算法
96多尺度Retinex增强算法
97PCA主成分分析算法
98线段检测LSD算法
99光流法目标追踪算法
100圆形检测概率霍夫变换算法
关注微信公众号"计算机视觉技术”,系统掌握100种计算机视觉技术算法。 微信公众号提供获取10000+计算机视觉技术最新技术PDF的URL链接和获取PDF的脚本工具。实际体验亲测稳定可靠。
100种算法,每一种算法都具体介绍了概念、原理、步骤、运行效果,以及完整的源码实现,您可以据此系统全面掌握计算机视觉技术算法。
如果您认为这篇技术博客对您有一点帮助,请一定点赞+评论+收藏+转发。您的支持是作者创作更多更好的技术博客的动力。