经典图像边缘检测算子全集 MATLAB 实现
项目介绍
本项目整理并用 MATLAB 原生代码实现了一套完整的经典图像边缘检测算子库。项目的核心目标是直观地展示不同边缘检测算法的原理差异与效果对比。代码在一个统一的框架下实现了从基础的微分算子(如 Robert、Prewitt)到基于罗盘掩膜的算子(Kirsch、Robinson),再到多阶段优化的 Canny 算子等八种算法。
该实现不仅调用了部分 MATLAB 基础滤波函数,更针对复杂的算子(如 Kirsch、Robinson 和 Canny)进行了底层的逻辑编写,非常适合图像处理领域的初学者和研究人员用于算法分析与教学演示。
包含的算法与特性
本项目在一个图形窗口中展示了原图及以下八种算子的处理结果:
- Robert 算子
* 利用 $2 times 2$ 的微小模板计算对角线方向的差分。
* 实现逻辑使用 $L_1$ 范数(绝对值之和)近似梯度幅值,定位精度高但对噪声敏感。
- Prewitt 算子
* 使用 $3 times 3$ 模板计算水平和垂直方向的差分。
* 通过先平均后差分的方式,具有一定的噪声抑制能力。
- Sobel 算子
* 在 Prewitt 的基础上增加了权重(中心权重为2),结合了高斯平滑和微分求导。
* 在抗噪性和边缘定位之间取得了良好的平衡。
- Laplacian 算子
* 基于二阶微分的各向同性算子。
* 使用经典的 $3 times 3$ 离散拉普拉斯卷积核
[0 1 0; 1 -4 1; 0 1 0]。
* 结果取绝对值以增强视觉显示。
- LoG (Laplacian of Gaussian) 算子
* 先应用高斯平滑降低噪声,再应用拉普拉斯算子检测边缘。
* 代码中设定高斯核大小为 5,标准差 Sigma 为 0.5。
- Kirsch 算子
* 一种基于罗盘(Compass)掩膜的非线性边缘检测器。
* 计算 8 个方向的卷积响应,取其中的最大值作为边缘强度。
- Robinson 算子
* 类似于 Kirsch,使用不同的系数组合(0, 1, 2),计算量略低。
* 同样采用 8 方向罗盘掩膜取最大响应值的逻辑。
- Canny 算子 (自定义实现)
* 被誉为最优边缘检测算法。
* 本项目
并非直接调用 MATLAB 工具箱函数,而是完整实现了 Canny 的五个核心步骤(高斯滤波、梯度计算、非极大值抑制、双阈值、滞后连接)。
代码核心逻辑分析
代码主要由主流程和两个关键的辅助算法函数组成:
1. 图像预处理与输入
- 程序首先尝试读取内置图像
cameraman.tif。 - 包含了容错机制:如果无法读取图片,会自动生成一个包含白色圆形的合成测试图像。
- 无论输入图像格式如何,统一转换为灰度图,并归一化为
double 类型 [0, 1] 区间,确保后续数学计算的精度。
2. 罗盘算子实现 (compute_compass_operator)
Kirsch 和 Robinson 算子共用了通用的罗盘算子计算逻辑:
- 基础模板定义:分别为两种算法定义了初始的“北向” $3 times 3$ 卷积核。
- 动态旋转生成:通过代码手动实现了矩阵元素的顺时针旋转逻辑,自动生成其余 7 个方向(西北、西、西南、南等)的模板,而非硬编码所有矩阵。
- 最大响应选取:对图像分别进行 8 次卷积操作,对比每个像素点在 8 个方向上的响应值,取最大值生成最终边缘图。
3. Canny 算子完整实现 (impl_canny)
这是代码中最复杂的函数,完整还原了 Canny 算法流程:
- 高斯平滑:使用
imgaussfilt (Sigma=1.0) 去除噪声。 - 梯度计算:使用 Sobel 算子计算水平和垂直梯度,进而得出幅值和方向(角度)。
- 非极大值抑制 (NMS):
* 将梯度方向量化为 0, 45, 90, 135 四个主要方向。
* 对每个像素,判断其在梯度方向上的两个邻域像素的幅值,仅保留极大值点(细化边缘)。
* 动态计算高阈值(最大幅值的 15%)和低阈值(高阈值的 5%)。
* 生成强边缘图像和弱边缘图像。
* 利用形态学重建 (
imreconstruct) 算法,以强边缘作为种子点,在弱边缘图中进行连接,从而补全边缘并去除孤立噪声。
使用方法
- 确保计算机安装了 MATLAB 软件。
- 将代码保存为
.m 文件。 - 直接运行该脚本。
- 程序将弹出一个图形窗口,以 $3 times 3$ 的布局展示:
* 原始图像
* Robert、Prewitt、Sobel、Laplacian、LoG、Kirsch、Robinson、Canny 八种算子的处理效果图。
- 如需处理自己的图像,只需修改代码开头的
imread 路径即可。
系统要求
- MATLAB R2016a 或更高版本(建议版本,主要依赖图像处理工具箱)。
- Image Processing Toolbox:代码依赖
imfilter、rgb2gray、im2double、fspecial、imgaussfilt、imreconstruct 等函数。