Canny 边缘检测算法

Canny 边缘检测算法

最优边缘准则

Canny 目标是找到一个最优的边缘检测算法,具体包含以下三个准则:

  1. 最优检测:能够尽可能多地标识出图像中的实际边缘,减少漏检和误检的概率。
  2. 最优定位:检测出的边缘点应尽可能接近真实边缘,减少噪声对边缘检测的影响。
  3. 检测点与边缘点一一对应:算子检测的边缘点应与实际边缘点保持对应关系。

算法实现步骤

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πσ21e2σ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πσ21e2σ2(ik1)2+(jk1)2


2. 计算梯度强度和方向

用于寻找灰度值变化最强的位置,即边缘。
使用 Sobel 算子计算梯度:

水平方向 Sobel 算子 (G_x)(检测 (y) 方向边缘)

[−101−202−101] \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} 121000121

垂直方向 Sobel 算子 (G_y)(检测 (x) 方向边缘)

[121000−1−2−1] \begin{bmatrix} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{bmatrix} 101202101

梯度大小计算公式:

G=Gx2+Gy2 G = \sqrt{G_x^2 + G_y^2} G=Gx2+Gy2

梯度方向计算公式:

θ=arctan⁡GyGx \theta = \arctan{\frac{G_y}{G_x}} θ=arctanGxGy


3. 非最大抑制(NMS,Non-Maximum Suppression)

用于去除非边缘像素,使边缘更加清晰。

操作步骤:

  1. 将梯度方向近似为 0°, 45°, 90°, 135°。
  2. 比较当前像素点与梯度方向上相邻像素点的梯度强度。
  3. 仅保留梯度强度最大的像素点,其余置为 0。

4. 应用双阈值的方法决定边界

该阶段用于确定哪些边缘是真正的边缘,哪些是噪声。

非极大抑制后,图像中仍然可能存在噪声点。Canny 算法采用双阈值技术

  • 设定上阈值 (maxVal) 和下阈值 (minVal)。
  • 若像素点的梯度强度 大于上阈值,则判定为强边缘(strong edge)
  • 若像素点的梯度强度 小于下阈值,则判定为非边缘
  • 若像素点的梯度强度 介于上下阈值之间,则为弱边缘(weak edge),需要进一步处理:
    • 若该像素与强边缘像素相邻,则保留为边缘。
    • 否则,认为是噪声并去除。

5. 利用滞后技术跟踪边界

该阶段进一步处理弱边缘,确保边缘的连续性。

思路:

  • 若弱边缘与强边缘相连,则认为它是真实边缘。
  • 若弱边缘未连接到强边缘,则认为它是噪声并抑制(置为 0)。
  • 通过检查弱边缘像素及其 8 邻域像素,如果其中至少一个是强边缘像素,则该弱边缘点被保留,否则被去除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值