canny算子_【图像处理】轻松搞懂Canny边缘检测

使用微分的方法即可完成边缘检测的任务,也就是说卷积模板锐化的方法都可以拿来做边缘检测,但像Sobel算子存在一些问题:

  • 没有充分利用边缘梯度方向
  • 阈值设定会极大影响检测效果,阈值设定过大,会丢失很多边缘信息;阈值设定过小,会有很多噪声

Canny边缘检测做了两个改进:

  • 基于边缘梯度方向的非极大值抑制
  • 双阈值的滞后阈值处理

Canny边缘检测算法介绍

  1. 通常来讲,第一步是要对图像做平滑处理,过滤掉噪声
  2. 使用x方向和y方向的两个Sobel卷积核,与图像进行卷积运算,分别得到
    。然后计算边缘强度(梯度幅值)

3. Canny不像Sobel那样对magnitude做255的截断,而是利用

计算出梯度方向,即对于每一个位置
,

其中,

要注意坐标轴的方向

28de19e429f3eb02015f840c150a3781.png

4. 对每一个位置做非极大值抑制NMS处理,保留当前点邻域内梯度方向上的最大的梯度,其余的置零,在比较梯度的时候实际上是当前点与梯度方向的两侧的点的梯度加权相比。

具体的比较方法要分为四种情况:

  • 第一种情况

e6ec35bd19ea46a2db7d5c5aa5a0df24.png

这种情况下,

,曲线偏向y轴,令
,则右下角和下面两个像素点的梯度加权可表示为

左上和上面的两个像素点的梯度加权可表示为

  • 第二种情况

604ec89fbc69e8afd9c4435808ffb9a2.png

同样,

,曲线偏向y轴,令
,

则右上角和上面两个像素点的梯度加权可表示为

左下和下面的两个像素点的梯度加权可表示为

  • 第三种情况

0f925600e6ef5f8908e18d9fef87714f.png

,曲线偏向x轴,令
,

则左上角和左面两个像素点的梯度加权可表示为

右下和右面的两个像素点的梯度加权可表示为

  • 第四种情况

ef7a479bb118270e007e8dc04bd1489c.png

同样,

,曲线偏向x轴,令
,

则左下角和左面两个像素点的梯度加权可表示为

右上和右面的两个像素点的梯度加权可表示为

以上就是四种情况的介绍,接下来要与两个加权做比较

如果

,则说明
为极大值,需要保留,否则置零。

需要注意的是,如果

,则直接置零。

5. 双阈值的滞后处理。使用的是两个阈值,高阈值和低阈值。按照三个规则进行阈值化处理:

  • 边缘强度大于高阈值的作为边缘点
  • 边缘强度小于低阈值的点直接剔除
  • 边缘强度在双阈值之间的点,需要判断该点邻域的八个点是否能和当前点连通,即八个点中是否包含足够数量的边缘点,数量设定为1即可

代码

import 

7a15367613bbf2e26270eb54702eb710.png

从图中可以看出,40-150的双阈值消去了0-150单阈值的一些杂乱的边缘细节,同时比40-255的细节更完整

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值