基于MATLAB的霍夫变换直线检测系统
项目简介
本项目是一个基于MATLAB开发的计算机视觉应用,旨在利用数字图像处理技术自动识别和提取图像中的直线特征。系统整合了图像预处理、边缘检测、标准霍夫变换(Standard Hough Transform, SHT)以及几何特征提取等核心算法。不仅支持外部图像文件的读取,还内置了合成图像生成器用于算法验证。该系统提供了一个直观的四窗口可视化界面,展示从原始图像到最终检测结果的完整处理流程,并能输出详细的直线几何参数。
功能特性
- 双模式输入支持:支持自动生成带有噪声和几何图形的合成测试图像,也支持读取本地外部图像文件。
- 鲁棒的预处理流程:包含自动灰度化处理以及高斯滤波去噪,有效降低图像高頻噪声对检测结果的干扰。
- 高精度边缘检测:使用Canny算子提取图像边缘,能够生成连续且精细的二值化边缘图。
- 标准霍夫变换分析:将图像边缘映射至参数空间(Rho-Theta),通过累加器阵列进行投票统计以定位直线。
- 智能峰值与线段提取:采用非极大值抑制和动态阈值策略筛选峰值,并根据设定的间隙填充与最小长度阈值合并线段。
- 全过程可视化:在一个图窗中同时展示原始图像、Canny边缘图、霍夫变换累加器热力图以及最终直线叠加结果。
- 详细数据报告:在控制台输出每条检测直线的ID、极径(Rho)、极角(Theta)及其在图像中的像素长度。
系统要求
- MATLAB R2018a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 打开MATLAB软件并定位到项目所在目录。
- 直接运行主脚本。
- 模式切换:
* 默认情况下,脚本中的
useSyntheticImage 变量设置为
true,系统将自动生成一张包含水平线、垂直线、对角线及模拟噪声的合成图像进行演示。
* 若需检测自己的图片,请在代码中将
useSyntheticImage 修改为
false,并确保
filename 变量指向有效的图片路径。
- 程序运行结束后,将弹出一个包含四个子图的结果窗口,并在MATLAB命令行窗口打印直线参数列表。
详细功能与算法实现逻辑
本项目的主程序通过严谨的线性流程处理图像,具体实现逻辑如下:
1. 环境初始化与图像获取
程序首先清理工作区、关闭现有图窗并屏蔽警告信息以确保运行环境整洁。
- 合成图像生成:如果启用合成模式,程序调用内部函数生成一张512x512像素的灰度图,并在其中绘制水平、垂直、正向对角及反向对角线条。同时,为了模拟真实环境,图像被叠加了高斯噪声(Gaussian Noise)和椒盐噪声(Salt & Pepper Noise),并添加了实心矩形块作为干扰项。
- 外部图像读取:若禁用合成模式,系统尝试读取指定路径的图像文件,若文件不存在则抛出错误提示。
2. 图像预处理
- 灰度转换:检查输入图像是否为彩色(RGB),如果是则通过权重法转换为灰度图像;如果是灰度图则保持不变。
- 高斯滤波:使用
imgaussfilt 函数对灰度图进行平滑处理。代码中设定标准差 Sigma 为 1.5,此参数决定了模糊程度,旨在平滑掉高频噪声点,减少边缘检测阶段的错误响应。
3. 边缘检测
采用
Canny算子 对平滑后的图像进行边缘提取。相较于Sobel算子,Canny算法在代码中被选用是因为其具有更好的边缘连接性且对噪声不敏感,能有效在二值化图像中保留直线的轮廓结构。系统使用自动计算的阈值生成二值边缘图像。
4. 霍夫变换 (Standard Hough Transform)
- 空间映射:利用
hough 函数将二值边缘图像从笛卡尔坐标系(x, y)映射到霍夫参数空间(rho, theta)。其中 Rho 代表原点到直线的垂直距离,Theta 代表垂线与x轴的夹角。 - 参数空间可视化:将生成的累加器矩阵进行灰度拉伸,应用热力图(Hot Colormap)配色,并绘制在坐标轴上。图中亮度越高的点表示该参数对应的直线存在的可能性越大。
5. 峰值检测与筛选
- 寻找峰值:使用
houghpeaks 函数在累加器矩阵中寻找局部最大值。 - 参数设定:
*
最大数量:代码限制最多检测 10 个峰值。
*
动态阈值:阈值设定为累加器最大值的 30%,低于此投票数的直线被忽略。
*
非极大值抑制 (NHoodSize):设定邻域大小为 [9 9],在此范围内的相近峰值会被抑制,避免同一条粗直线被重复检测。
6. 直线段提取与几何重构
利用
houghlines 函数根据筛选出的峰值参数(Rho, Theta)在原始边缘图像中寻找对应的线段:
- FillGap(填充间隙):设置为 20 像素。如果两条共线线段之间的距离小于此值,它们将被合并为一条直线。
- MinLength(最小长度):设置为 40 像素。长度短于此值的线段将被视为噪声或背景杂波而被剔除。
7. 结果可视化与数据输出
- 图像叠加:在原始图像上,使用绿色粗线绘制检测到的直线段,使用黄色“x”标记起点,红色“x”标记终点,以此直观展示检测到的直线位置和方向。
- 参数统计:代码计算每条线段的欧几里得距离作为长度,并格式化输出表格,包含:
* 直线ID
* Rho(距离参数)
* Theta(角度参数,单位:度)
* 长度(像素单位)
- 空结果处理:如果未检测到满足条件的直线,系统将在结果图中以红色文字醒目提示“未检测到直线”。