边缘分割(Canny算子)

最近有用到Canny算子做边缘检测。回顾一下Canny算子的基本原理:总的来说,图像的边缘检测必须满足两个步骤

    (1)有效的抑制噪声,使用高斯算子对图像进行平滑;

    (2)尽量精确的确定边缘的位置;

Canny算子的边缘检测可以分为三个步骤:

Step 1:  高斯平滑函数。目的是为了平滑以消除噪声;

Step 2:一阶差分卷积模板。目的是为了达到边缘增强。

  该步骤有点类似于与两个方向模板进行卷积运算。这两个方向模板为(a)和(b)所示:左图体现的是在X方向上的差异,右图体现的是在y方向上的差异。同时获得梯度幅值的大小以及方向角。通过该步,获得在边缘位置处特征被加强的图像。

Step 3:非极大值抑制(NMS)。目的是保留梯度方向上的最大值。

这一步是比较关键的一点:

仅仅得到全局的梯度并不足以确定边缘,因此为确定边缘,必须保留局部梯度最大的点,而抑制非极大值

图2非极大值抑制


四个扇区的标号为0到3,对应3*3邻域的四种可能组合。
      在每一点上,邻域的中心象素M与沿着梯度线的两个象素相比。如果M的梯度值不比沿梯度线的两个相邻象素梯度值大,则令M=0。

——假设上一步骤得到的梯度图为G(x,y);对G(x,y)进行初始化:N(x,y)=G(x,y)

——在梯度和反梯度方向上各找n个像素点。若G(x,y)不是这些点中的最大点,则将N(x,y)置为0,否则保持N(x,y)不变。

Step4:  双线性阈值

首先是一个较大的阈值:Nmax.使用该阈值二值化后的图像含有较少的假的边缘点,但是端点较多!

使用较小的阈值:Nmin,使用该阈值二值化后的图像含有较多的假的边缘点;

通过上一步获取的边缘点,判断其8邻域内有无第二步获得的边缘点,然后进行连接!


另一种简单的方法是,把梯度方向简化为4个方向:『0,45,90,135』

最后一步为对N(x,y)进行阈值化处理:

大的阈值会得到——少量的边缘点以及众多的空隙

小的阈值会得到——大量的边缘点以及众多的错误检测。

一般Low=0.4High。

原文地址:https://www.cnblogs.com/CBDoctor/p/2220331.html