边缘是图像中像素值剧烈变化的区域,反映了目标的轮廓、纹理等关键信息。边缘检测是图像分割、目标识别等任务的基础。本文将系统解析 六种经典边缘检测算子 的数学原理、实现方法及适用场景,并给出完整的MATLAB代码示例和对比分析。
1. 边缘检测基础
1.1 边缘类型
- 阶跃边缘:像素灰度值在局部范围内发生突变(如物体与背景的交界)
- 斜坡边缘:灰度值逐渐变化,可能存在模糊或反光干扰
- 线状边缘:细长区域灰度与周围差异明显(如裂缝、文字笔画)
1.2 边缘检测流程
- 去噪:高斯滤波等预处理平滑图像
- 梯度计算:获取像素梯度幅值与方向
- 非极大值抑制:细化边缘宽度至单像素级
- 双阈值处理(可选):消除伪边缘,连接断裂区域
2. 一阶微分算子
2.1 Roberts算子
- 原理:利用对角线方向的差分近似梯度,检测45°和135°边缘
- 卷积核:
MATLAB实现:
img = im2double(imread('cameraman.tif'));
kernel_x = [1 0; 0 -1]; % Roberts横向核
kernel_y = [0 1; -1 0]; % Roberts纵向核
grad_x = imfilter(img, kernel_x, 'replicate');
grad_y = imfilter(img, kernel_y, 'replicate');
edge_roberts = sqrt(grad_x.^2 + grad_y.^2); % 梯度幅值
edge_roberts = edge_roberts > 0.2; % 直接阈值化
figure; imshow(img); title('原始图片');
figure; imshow(edge_roberts); title('Roberts边缘检测');
2.2 Sobel算子
- 原理:加权平均差分算法,对水平和垂直边缘敏感
- 卷积核:
MATLAB实现(带梯度方向):
[grad_x, grad_y] = imgradientxy(img, 'sobel');
[magnitude, direction] = imgradient(grad_x, grad_y);
edge_sobel = magnitude > 0.3; % 根据图像调整阈值