zoukankan      html  css  js  c++  java
  • 边缘分割(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。

  • 相关阅读:
    asp.net
    深度优先遍历
    计算机存储体系
    CPU 进程 线程 关系与区别
    OLAP、OLTP的介绍和比较
    几种消息队列对比
    协议那些事(四)
    协议那些事(三)
    协议那些事(二)
    协议那些事(一)
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2220331.html
Copyright © 2011-2022 走看看