Canny 边缘检测(Canny, 1986)从输入图像生成单像素宽的二值边缘图。边缘可以作为分割的边界线索——连通边缘围成的闭合区域对应物体的轮廓。
以下符号定义适用于全篇:
- I:输入图像
- Gσ:标准差为 σ 的高斯核
- S=I∗Gσ:高斯平滑后的图像
- Sx,Sy:平滑图像 S 在 x,y 方向的梯度(用 Sobel 算子计算)
- M(x,y)=Sx2+Sy2:梯度幅值图
- Θ(x,y)=arctan(Sy/Sx):梯度方向图,取值 (−180∘,180∘]
- Θq(x,y):Θ 量化到 {0∘,45∘,90∘,135∘} 后的方向图
- N(x,y):非极大值抑制后的候选边缘图
- TH,TL:高阈值和低阈值,TH:TL∈[2:1,3:1]
- E(x,y):最终输出的二值边缘图
步骤一:高斯平滑#
S=I∗Gσ高斯卷积去除高频噪声,减小后续梯度计算对噪声的敏感度。σ 控制平滑强度,σ 越大保留的边缘越少(只保留强结构),σ 越小保留的细节越多但也包含更多噪声。典型取值范围 σ∈[1,2]。
步骤二:计算梯度幅值与方向#
用 Sobel 算子计算 Sx 和 Sy,逐像素得到 M(x,y) 和 Θ(x,y)。
将 Θ 量化到四个离散方向,为 NMS 步骤的邻域比较做准备:
| Θq | 角度范围 | 比较方向 |
|---|
| 0∘ | [−22.5∘,22.5∘] 或 [157.5∘,202.5∘] | 水平(左右) |
| 45∘ | [22.5∘,67.5∘] 或 [202.5∘,247.5∘] | 东北-西南 |
| 90∘ | [67.5∘,112.5∘] 或 [247.5∘,292.5∘] | 垂直(上下) |
| 135∘ | [112.5∘,157.5∘] 或 [292.5∘,337.5∘] | 西北-东南 |
步骤三:非极大值抑制(NMS)#
沿梯度方向寻找局部极大值。对每个像素 (x,y),取 Θq(x,y) 方向上的前一个和后一个邻域像素,记其幅值为 Mprev 和 Mnext。
N(x,y)={M(x,y),0,M(x,y)≥Mprev and M(x,y)≥MnextotherwiseNMS 是 Canny 输出单像素宽边缘的关键:在垂直梯度方向(即沿边缘法线),只会有一个像素被保留,该像素处于局部梯度峰值位置。
步骤四:双阈值滞后跟踪#
将 N 中的候选像素按幅值分为三类:
⎩⎨⎧强边缘:弱边缘:非边缘:N(x,y)≥THTL≤N(x,y)<THN(x,y)<TL强边缘直接标记为边缘输出。弱边缘只有在其 8-邻域内存在至少一个强边缘像素时才被激活为边缘——这就是滞后跟踪:
E(x,y)=⎩⎨⎧1,1,0,N(x,y)≥THTL≤N(x,y)<TH and ∃ 强边缘在 8-邻域内otherwise滞后跟踪利用了边缘的连续性:真实边缘可能在局部出现弱梯度(表面不平整或光照不均),但这些弱梯度区域与强边缘相连,应被保留。孤立的噪声响应不与任何强边缘相连,自然被丢弃。
从边缘到分割#
Canny 输出的是二值边缘图 E(x,y)。要得到完整的区域分割,还需后续处理:
- 形态学闭合:对边缘图做闭运算(膨胀+腐蚀),连接断裂的边缘段。
- 轮廓填充:提取连通轮廓,填充封闭区域。
- 分水岭标记:将 Canny 边缘作为分水岭输入或外部标记。
Canny 不产生闭合的连续边界,但在大多数图像上产生的边缘是分割的有效中间线索。