原生MATLAB全流程Canny边缘检测系统
项目简介
本项目是一个完全基于MATLAB基础语法和矩阵运算实现的Canny边缘检测系统。其核心特色在于零依赖:代码完全不调用MATLAB的图像处理工具箱(Image Processing Toolbox)中的任何高级内置函数(如 edge, fspecial, imfilter, conv2 等)。
项目从底层编写了高斯核生成、矩阵卷积运算、梯度计算、非极大值抑制(NMS)、双阈值分类以及基于堆栈的滞后边缘连接算法。这不仅是一个功能完整的边缘检测工具,更是深入理解计算机视觉底层算法数学原理和从零实现过程的绝佳示例。
功能特性
- 完全原生实现:仅使用MATLAB的基础矩阵操作(加减乘除、索引、逻辑判断),摆脱了对外部工具箱的依赖。
- 交互式/自动演示模式:程序运行时会弹出文件选择窗口;若用户取消选择,系统会自动生成包含几何图形的合成图像进行演示。
- 手动卷积引擎:内置自定义的卷积函数,采用滑窗法和矩阵点乘实现,并包含了边界填充与核旋转逻辑。
- 完整的Canny流水线:严格遵循Canny算法的五个标准步骤。
- 详细的过程可视化:运行结束后,通过6个子图分别展示原始图、平滑图、梯度幅值、NMS结果、双阈值分类图及最终边缘图。
系统要求
- 软件版本:MATLAB R2016a 及以上版本(理论上支持所有现代版本)。
- 工具箱:不需要任何额外工具箱。
使用方法
- 将项目代码保存为
.m 文件。 - 在MATLAB命令窗口中直接运行主函数。
- 模式选择:
*
加载图片:在弹出的文件选择框中选择一张
.jpg,
.png,
.bmp 或
.tif 图片。
*
演示模式:直接关闭文件选择框或点击“取消”,程序将自动生成一张包含白色方块和圆形掩膜的500x500测试图像进行处理。
- 等待控制台输出处理进度,最终查看生成的对比结果图。
详细算法实现与逻辑分析
本项目代码主要分为主控制流和底层辅助函数两部分,具体实现逻辑如下:
1. 图像读取与预处理
- 手动灰度转换:不使用
rgb2gray。代码检测图像通道数,若是彩色图像,利用NTSC标准加权公式(R*0.2989 + G*0.5870 + B*0.1140)将RGB图像转换为灰度矩阵。 - 归一化:将灰度值除以255.0,转换到 [0, 1] 的双精度浮点空间,便于后续数学运算。
2. 高斯滤波 (Gaussian Smoothing)
- 自定义高斯核:根据设定的标准差(sigma=1.4)和核大小(5x5),利用二维高斯数学公式计算核矩阵,并进行归一化处理,确保滤波后图像亮度不变。
- 手动卷积:通过双重循环遍历图像像素,提取感兴趣区域(ROI),与旋转180度后的高斯核进行点积求和,实现真正的卷积操作而非相关操作,有效去除高频噪声。
3. 梯度及其方向计算
- Sobel算子构建:手动定义水平(Gx)和垂直(Gy)方向的3x3 Sobel算子。
- 梯度计算:再次调用自定义卷积函数计算水平和垂直梯度。
- 幅值与方向:利用勾股定理计算梯度幅值;利用
atan2 计算梯度方向弧度,并将其转换为角度(0-360度),同时处理了负角度归一化。
4. 非极大值抑制 (Non-Maximum Suppression, NMS)
- 方向量化:将每个像素的梯度方向划分为四个主要方向区间(0度、45度、90度、135度)。
- 邻域插值比较:代码通过逻辑判断锁定当前像素沿梯度方向的两个邻域像素。只有当当前像素的梯度幅值同时大于这两个邻域像素时,该点才被保留,否则被抑制(置零)。此步骤将宽边缘细化为单像素宽度的线条。
5. 双阈值检测 (Double Thresholding)
- 自适应阈值计算:基于NMS结果中的最大梯度幅值,按照固定比例计算高阈值(15%)和低阈值(高阈值的5%)。
- 像素分类:
*
强边缘:幅值 >= 高阈值,确认为边缘。
*
弱边缘:低阈值 <= 幅值 < 高阈值,标记为候选边缘。
*
抑制:幅值 < 低阈值,归为背景。
6. 边缘连接/滞后处理 (Hysteresis Edge Tracking)
- 连通性分析:算法利用堆栈(Stack)数据结构模拟递归过程,避免栈溢出风险。
- 8-邻域搜索:从所有强边缘点出发,将其压入栈中。弹出栈顶元素后,检查其8邻域内的像素。如果邻域像素属于“弱边缘”且未被访问过,则将其“提升”为强边缘,标记为已访问,并压入栈中继续搜索。
- 断点修复:通过这种方式,只有与强边缘相连的弱边缘才会被保留,独立的弱边缘噪点被剔除。
7. 辅助功能实现
- 矩阵卷积函数:实现了一个通用的二维卷积逻辑。为了处理边界问题,采用了填充策略(创建全零的padded矩阵),并将核心运算通过
sum(sum(ROI .* Kernel)) 实现。为了保证数学上的严谨性,在运算前对核进行了 rot90(kernel, 2) 旋转。 - 结果可视化:使用
subplot 构建了2行3列的图表,特别是在双阈值检测的可视化中,利用RGB通道合成技术,将强边缘显示为红色,弱边缘显示为蓝色,直观展示分类结果。