基于Hough变换的直线检测系统
项目介绍
本项目实现了一个基于自主开发的Hough变换算法的直线检测系统。系统能够从包含噪声的图像中准确提取直线特征,通过将图像空间的边缘像素点映射到极坐标参数空间,利用累加器投票机制识别显著趋势。该项目包含了从图像预处理、边缘提取到几何参数转换及线断重构的完整流程,不仅适用于理想几何图形的检测,也能应对通过合成方式模拟的复杂现实环境。
功能特性
- 自动生成包含对角线、副对角线、水平线和垂直线的合成测试图像。
- 集成高斯噪声模拟功能,用于测试算法在非理想环境下的鲁棒性。
- 采用中值滤波技术,能够在滤除干扰噪声的同时有效保护边缘信息。
- 实现了经典Canny算子边缘检测,提供像素级的边缘定位。
- 手写实现的矩阵化Hough变换算法,替代工具箱内置函数,深入底层逻辑。
- 具备非极大值抑制(NMS)的峰值搜索功能,防止同一条直线被重复检测。
- 支持线段分离与提取,可根据最大允许间隙和最小长度阈值识别离散的线段。
- 交互式多视图可视化界面,展示边缘图、参数空间热力图及最终识别结果。
逻辑流程说明
系统的执行逻辑遵循数字图像处理的标准pipeline:
- 图像初始化:系统首先创建一个512x512的黑色画布,手动绘制四条穿过图像的直线,并注入均值为0、方差为0.01的高斯噪声,模拟真实的传感器捕获效果。
- 预处理阶段:对输入图像进行灰度化处理(若为彩色图),随后应用3x3模板的中值滤波。这一步是确保后续边缘检测准确性的关键。
- 边缘特征提取:调用Canny算子对去噪后的图像进行处理,生成二值化的边缘掩模图,为参数空间映射提供计算基础。
- Hough空间映射:
- 定义角度分辨率为1度(-90°至89°)。
- 计算图像对角线长度作为极径Rho的搜索范围。
- 遍历所有边缘像素点,利用公式 rho = x*cos(theta) + y*sin(theta) 进行投影。
- 使用矩阵化运算填充累加器矩阵,统计每个(theta, rho)组合的得票数。
- 峰值提取与抑制:
- 动态计算投票阈值(最大票数的40%)。
- 循环寻找最大值点,并在每次找到峰值后,将其周围21x11的邻域清零,确保检测到的直线具有代表性。
- 线段重构:
- 针对检测到的每一组参数,反向寻找原图中满足距离约束(dist < 1像素)的边缘点。
- 根据直线的倾斜角度(以45度为界)自动切换排序维度(X轴或Y轴排序)。
- 遍历有序点集,根据设定的20像素间隙阈值(fillGap)判断线段是否中断,并滤除长度小于50像素(minLineLen)的短碎线。
- 结果展示:将检测到的Rho-Theta参数点标注在参数空间图中,并将重构后的直线段以绿色线条绘制在原图上,同时用黄色和红色十字叉标注起点和终点。
关键算法与技术细节
- 极坐标参数化:系统通过 rho = x*cos(theta) + y*sin(theta) 将图像空间的点转换为参数空间的正弦曲线。这种方法解决了直角坐标系下斜率无穷大(垂直线)无法表示的问题。
- 矩阵化运算优化:算法预先计算了所有角度的三角函数值,避免在嵌套循环中重复计算,大幅提升了Hough映射的速度。
- 非极大值抑制:在参数空间中,峰值通常不是孤立的一个点,而是一团高亮度区域。系统通过局域置零法,确保了检测结果的稀疏性和准确性。
- 启发式线段提取:不同于仅检测无限长直线的标准Hough变换,本项目通过跟踪边缘像素点之间的欧几里得距离,实现了从无限长直线到有限长线段的转化,更加符合实际应用需求。
使用方法
- 确保您的计算机中已安装MATLAB R2016b或更高版本,并安装了Image Processing Toolbox(图像处理工具箱)。
- 在MATLAB的工作路径(Current Folder)中打开包含本项目逻辑的目录。
- 在命令行窗口直接调用主函数(如在控制台输入主入口对应的函数名)并回车。
- 系统会自动打开一个名为“Hough变换直线检测系统”的图形窗口,展示处理全过程。
- 在MATLAB命令行窗口中查看输出的详细统计信息,包括检测到的直线总数、每条线的极坐标参数以及起止点像素坐标。
系统要求
- 软件环境:MATLAB (推荐使用2018a及以上版本)。
- 硬件环境:至少4GB RAM,支持图形显示。
- 依赖项:仅需MATLAB基础库及图像处理工具箱。