数字图像处理霍夫变换特征检测系统
项目简介
本项目是一个基于MATLAB平台开发的数字图像处理系统,旨在深入实现并展示霍夫变换(Hough Transform)算法的核心原理。系统专注于从复杂的背景中提取几何特征(直线和圆)。与直接调用现成库函数不同,本项目在代码中通过底层逻辑手动实现了霍夫变换的投票累积过程、参数空间构建以及峰值检测算法。
程序内置了测试图像生成模块,能够模拟包含噪声(高斯噪声和椒盐噪声)的真实环境,展现了算法在边缘断裂和干扰下的鲁棒性。该系统集成了从图像预处理、边缘提取、参数空间变换到最终几何特征逆向还原的完整处理流水线。
功能特性
- 合成数据生成:自动生成包含多条直线(对角线、平行线、水平线)和圆形图案的合成图像,并叠加高斯与椒盐混合噪声以模拟真实场景。
- 图像预处理流水线:实现了灰度图像的高斯滤波平滑降噪,以及基于自动阈值的Canny边缘检测,生成高质量的二值边缘映射。
- 自定义霍夫直线变换:不依赖工具箱,手动实现了标准霍夫变换(SHT),将边缘点映射至 Rho-Theta 极坐标参数空间。
- 自定义霍夫圆变换:手动实现了基于固定半径范围搜索的霍夫圆检测算法,构建累加器空间并进行投票。
- 参数空间可视化:提供霍夫参数空间的频谱热力图(直线)和累加响应图(圆),直观展示算法的投票分布情况。
- 非极大值抑制(NMS):在参数空间中实现了带有邻域抑制功能的峰值搜索算法,有效避免了对同一直线或圆的重复检测。
- 几何特征还原:利用提取的参数($rho, theta$ 及圆心坐标、半径)在原始图像上通过数学方程逆向绘制检测结果。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(用于基础的
edge, imgaussfilt, imnoise 函数)
使用方法
- 确保MATLAB环境已安装并配置正确。
- 直接运行
main.m 脚本。 - 程序将依次弹出窗口显示处理过程的各个阶段:
* 原始含噪图像
* Canny边缘检测结果
* 霍夫直线参数空间热力图
* 霍夫圆累加器可视化
* 最终标记了直线(红色)和圆(绿色)的检测结果
算法实现细节与逻辑分析
本项目核心逻辑完全在 main 函数及其子函数中实现,具体流程如下:
1. 图像生成与预处理
- 数据合成:程序首先初始化一个全黑的 $400 times 400$ 矩阵,通过循环和逻辑掩码在其中绘制线条和圆形。
- 噪声模拟:为了测试算法的抗噪性,依次添加了密度为0.02的椒盐噪声和方差为0.01的高斯噪声。
- 降噪与边缘提取:使用了
imgaussfilt ($sigma=1.5$) 进行平滑处理,随后调用 edge 函数利用 Canny 算子提取二值化边缘。
2. 霍夫直线检测 (Custom Implementation)
- 参数空间构建:代码定义了
perform_hough_lines 函数。该函数首先计算图像对角线长度以确定 $rho$ 的取值范围,并设定 $theta$ 分辨率。 - 投票机制:遍历二值图像中的每一个边缘点 $(x, y)$,针对每一个设定的角度 $theta$,利用公式 $rho = x costheta + y sintheta$ 计算对应的距离参数。
- 累加器更新:将计算出的连续 $rho$ 值量化为索引,在二维累加器矩阵中对应位置加1。
- 峰值搜索:通过
find_hough_peaks 函数在累加器中寻找局部最大值。该函数实现了迭代式的非极大值抑制:找到全局最大值后,将其记录并清零其周围邻域,防止同一特征产生多个峰值。
3. 霍夫圆检测 (Custom Implementation)
- 降维搜索策略:在
perform_hough_circles 函数中,为了兼顾性能与教学意义,算法在指定的半径范围 $[minR, maxR]$ 内进行迭代。 - 几何投票:对于每一个假设的半径 $r$,代码预先计算圆周的相对坐标偏移量。遍历每个边缘点,将其作为圆周上的点,反向计算可能的圆心位置,并在对应的累加器平面上进行投票。
- 结果优化:
* 对每一层半径的累加器进行高斯模糊以平滑噪声。
* 利用设定的灵敏度阈值提取圆心候选点。
* 实现后处理逻辑,通过计算圆心距离和半径差值,合并空间位置过近的重复圆检测结果。
4. 结果可视化与还原
- 直线绘制:解析霍夫空间提取的 $(rho, theta)$ 参数。代码中包含了详细的逻辑判断:当直线接近垂直($sintheta approx 0$)时使用特殊方程绘制,否则使用常规截距式方程计算图像边界切点,从而在原图上画出红色的直线段。
- 圆绘制:根据提取的 $(x, y, r)$ 参数,利用参数方程生成圆周坐标点,并在原图上以绿色线条和十字标记绘制检测到的圆形。