Canny 边缘检测算法
最优边缘准则
Canny 目标是找到一个最优的边缘检测算法,具体包含以下三个准则:
- 最优检测:能够尽可能多地标识出图像中的实际边缘,减少漏检和误检的概率。
- 最优定位:检测出的边缘点应尽可能接近真实边缘,减少噪声对边缘检测的影响。
- 检测点与边缘点一一对应:算子检测的边缘点应与实际边缘点保持对应关系。
算法实现步骤
1. 高斯滤波(去噪)
使用高斯滤波对图像进行平滑处理,以减少噪声干扰。
二维高斯函数定义如下:
H(x,y)=12πσ2e−x2+y22σ2 H(x,y) = \frac{1}{2\pi \sigma^2} e^{- \frac{x^2 + y^2}{2\sigma^2}} H(x,y)=2πσ21e−2σ2x2+y2
H[i,j]=12πσ2e−(i−k−1)2+(j−k−1)22σ2 H[i,j] = \frac{1}{2\pi \sigma^2} e^{- \frac{(i-k-1)^2 + (j-k-1)^2}{2\sigma^2}} H[i,j]=2πσ21e−2σ2(i−k−1)2+(j−k−1)2
2. 计算梯度强度和方向
用于寻找灰度值变化最强的位置,即边缘。
使用 Sobel 算子计算梯度:
水平方向 Sobel 算子 (G_x)(检测 (y) 方向边缘):
[−101−202−101] \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} −1−2−1000121
垂直方向 Sobel 算子 (G_y)(检测 (x) 方向边缘):
[121000−1−2−1] \begin{bmatrix} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{bmatrix} 10−120−210−1
梯度大小计算公式:
G=Gx2+Gy2 G = \sqrt{G_x^2 + G_y^2} G=Gx2+Gy2
梯度方向计算公式:
θ=arctanGyGx \theta = \arctan{\frac{G_y}{G_x}} θ=arctanGxGy
3. 非最大抑制(NMS,Non-Maximum Suppression)
用于去除非边缘像素,使边缘更加清晰。
操作步骤:
- 将梯度方向近似为 0°, 45°, 90°, 135°。
- 比较当前像素点与梯度方向上相邻像素点的梯度强度。
- 仅保留梯度强度最大的像素点,其余置为 0。
4. 应用双阈值的方法决定边界
该阶段用于确定哪些边缘是真正的边缘,哪些是噪声。
非极大抑制后,图像中仍然可能存在噪声点。Canny 算法采用双阈值技术:
- 设定上阈值 (maxVal) 和下阈值 (minVal)。
- 若像素点的梯度强度 大于上阈值,则判定为强边缘(strong edge)。
- 若像素点的梯度强度 小于下阈值,则判定为非边缘。
- 若像素点的梯度强度 介于上下阈值之间,则为弱边缘(weak edge),需要进一步处理:
- 若该像素与强边缘像素相邻,则保留为边缘。
- 否则,认为是噪声并去除。
5. 利用滞后技术跟踪边界
该阶段进一步处理弱边缘,确保边缘的连续性。
思路:
- 若弱边缘与强边缘相连,则认为它是真实边缘。
- 若弱边缘未连接到强边缘,则认为它是噪声并抑制(置为 0)。
- 通过检查弱边缘像素及其 8 邻域像素,如果其中至少一个是强边缘像素,则该弱边缘点被保留,否则被去除。