opencv日常之Canny边缘检测 1

大部分人认为Canny边缘检测是最优的边缘检测方法,Canny边缘检测方法可以得到清晰明了的边缘;大部分图像处理包都提供了一个专门的canny边缘检测函数;这篇文章我们来看看Canny边缘检测的原理。

Canny边缘检测需要经过一下几步:

1.预处理

2.计算梯度

3.非极值抑制

4.阈值与滞后效应(此处不知翻译的对不对,英文表达是:Thresholding with hysterysis)

<1>预处理

边缘检测是对噪声敏感的,所以在边缘检测前要作平滑处理,一般用的是 Gaussian blur ,一个标准差为1.4的5*5 高斯滤波器

<2>计算梯度值

对图像中的每一个pixel,计算其梯度值,包括梯度的大小和方向;梯度的大小决定了该点是不是边缘点,梯度值大说明在该点周围的灰度值变化快,是个边缘点,梯度值小说明该点不是边缘点;梯度的方向指明了边缘的方向。
计算梯度值一般用的是sobel边缘算子。
梯度值大小计算公式:这里写图片描述
方向计算公式:这里写图片描述
其中
Gx = L(x+1,y) - L(x-1,y)
Gy = L(x,y+1) - L(x,y-1)

<3>非极值抑制

这一步的作用很明显,就是如果一个像素不是最大值,就被抑制了。
遍历所有像素,对于每一个像素,梯度方向分布在四个域。
如下图所示:
这里写图片描述
对于中间的灰色像素,他的边缘有四个可能方向:黄色方向,蓝色方向,红色方向,绿色方向。在上一步中计算出了该像素的梯度方向,根据梯度方向可以估计出边缘方向。
接下来以一个例子来说明非极大值抑制。
如图所示:
Gradient orientation from 22.5 to 67.5 degrees
这里写图片描述
如果梯度方向在上图所示的范围内,说明梯度的变化是从左上角到右下角,而边缘就是右上角到左下角方向的。
要检测这个中心红点是不是边缘点,就需要检测这个点的梯度值和左上角以及右下角的点的梯度值相比是不是极大值。如果是极大值并且它的梯度值大于upper threshold,就把它当作边缘点。

<4>阈值与滞后效应

在上一步中,我们已经找到了梯度值比上限阈值大的像素。这一步利用梯度的方向和下限阈值。
Here’s the idea:
1.如果当前像素不是边缘点,选下一个。
2.如果是边缘点,再选择边缘方向上的两个点(垂直于之前选择的边缘点的梯度方向)。如果有一个点或者两个点都满足一下条件:
1>和中心像素有相同的方向
2>梯度值比下限阈值大
3>他们的梯度值比相邻像素大

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值