返回

边缘检测

Edge Detection - 梯度算子与 Canny 边缘检测算法
第二章 / 图像预处理
参数面板

切换边缘检测算子,观察当前窗口如何形成梯度或 Canny 阶段结果;只突出当前方法的边缘判定证据。

窗口定位辅助操作
用方向键或下方 4 个按钮移动当前窗口;也可以直接点击原图或结果图跳转。
当前像素 (0, 0)1 / 4096
方向
概念说明

边缘检测在找什么

边缘检测把灰度突变转换为可观察的响应图。图源:scikit-image edge filter 示例
任务

当我们要让计算机找到物体的轮廓、线条或明暗交界时,不能只看某个像素是深是浅,而要看它和周围像素的灰度变化有多大。

思路

常用的处理办法是在小窗口里计算灰度变化:可以用一阶差分得到水平和竖直方向的变化量,再合成梯度幅值;可以用二阶导数找变化最陡的零点;也可以用 Canny 流程先平滑再求梯度、做非极大值抑制和双阈值筛选。

观察

点击或拖动窗口到明暗交界处、平坦区域和噪声点,对比不同算子的响应图;注意灰度跳变越大的地方响应越强,而阈值和参数改变会如何影响检测到的边缘数量和粗细。

方向键移动 / 点击原图或结果图跳转当前结果像素 (0, 0)
1 / 4096
原图64×64
红点定位当前中心像素;下方展开实际参与计算的 3×3 邻域。
梯度计算
1 / 4096
结果64×64
绿框对应结果图中的当前像素,可点击结果图直接定位
输入邻域3×3
0.00
0.00
0.00
0.00
0.46
0.53
0.00
0.46
0.53
原图第 1-3 行 / 第 1-3 列
算子类型
Sobel — 一阶差分梯度算子
Gx 核3×3
-1
+0
+1
-2
+0
+2
-1
+0
+1
水平方向梯度: Gx = 1.58
Gy 核3×3
-1
-2
-1
+0
+0
+0
+1
+2
+1
垂直方向梯度: Gy = 1.44
梯度输出
梯度幅值
2.14
Gx2 + Gy2
梯度方向
42°
atan2 ( Gy , Gx )
Sobel 梯度计算

当前位置 (0, 0) 的 3×3 邻域内进行一阶梯度计算。

幅值 2.14
|G(0,0)| = Gx2 + Gy2 = 1.582 + 1.442 = 2.14
θ(0,0) = tan-1 (GyGx) = tan-1 (1.441.58) = 42°

当前窗口中,将输入邻域与 Gx / Gy 核分别卷积,得到水平梯度 1.58 和垂直梯度 1.44;最终幅值为两者平方和的平方根。

邻域与核矩阵展开

下面对应左侧流程的三列:输入邻域(红色)、核矩阵(琥珀色)、梯度输出(翠绿色)。

Gx + Gy 展开
输入邻域 (3×3)
1-3 行 / 第 1-3
0.00
0.00
0.00
0.00
0.46
0.53
0.00
0.46
0.53
Sobel 核
与输入逐项对应相乘
Gx 核
-1
+0
+1
-2
+0
+2
-1
+0
+1
Gy 核
-1
-2
-1
+0
+0
+0
+1
+2
+1
逐项乘积 (Gx)
每格: pixel × weight
0.00×-1=0.00
0.00×0=0.00
0.00×1=0.00
0.00×-2=0.00
0.46×0=0.00
0.53×2=1.06
0.00×-1=0.00
0.46×0=0.00
0.53×1=0.53
梯度输出
水平梯度 Gx
1.58
垂直梯度 Gy
1.44
梯度幅值
2.14
√(Gx² + Gy²)
梯度方向
42°
各算子对比

切换左侧算子下拉框,对比不同边缘检测方法的特点。

Roberts
2×2 / 对角差分
+计算最快-对噪声敏感
Sobel
3×3 / 加权差分
+抗噪较好-边缘较粗
Prewitt
3×3 / 简单差分
+实现简单-权重均等
Laplace
3×3 / 二阶微分
+方向无关-噪声敏感
Canny
多阶段 / Canny 准则下接近最优
+细/连续-计算复杂