数字图像处理(十四)Canny边缘检测

前提:基于微分算子(Sobel等)的边缘提取存在的一个比较麻烦的问题是如何选取合适的阈值,可以使边缘从细节当中提取出来。阈值的选择不同,所提取的边界信息就不同。
Canny给出了评价边缘检测性能的三个指标:

  1. 好的信噪比,即将非边缘点判为边缘点的概率要低,将边缘点判为非边缘点的概率要低;
  2. 好的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;
  3. 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假边界要得到最大抑制。

简单来说,就是希望在提高对景物边缘的敏感性的同时,可以抑制噪声的方法才是好的边缘提取方法。

Canny算法流程

  1. 高斯滤波。
    滤波的主要目的是降噪,高斯滤波会使图像变得平滑(模糊)。高斯分布(正态分布)面是一个中间大两边小的曲面。一般滤波器大小为 5 × 5 5\times 5 5×5

  2. 计算图像梯度和幅值
    在水平和垂直方向采用Sobel算子(不一定非要使用Sobel)计算得到水平方向的边缘 G ( x ) G(x) G(x)和垂直方向的边缘 G ( y ) G(y) G(y)。然后计算每个像素的梯度值和梯度方向(梯度方向是边缘的法线方向)。
    E d g e _ G r a d i e n t ( G ) = ( G x ) 2 + ( G y ) 2 Edge\_Gradient(G)=\sqrt{(G_x)^2+(G_y)^2} Edge_Gradient(G)=(Gx)2+(Gy)2
    A n g l e ( θ ) = arctan ⁡ ( G y G x ) Angle(\theta)=\arctan(\frac{G_y}{G_x}) Angle(θ)=arctan(GxGy)
    在这里插入图片描述

  3. 非极大抑制
    非极大值抑制时边缘检测的一个重要步骤,通俗意义上讲是寻找像素点局部最大值,将中心像素x与沿着其对应的梯度方向的两个像素值相比,若中心像素为最大值,则保留,否则中心像素置0。这样可以抑制非极大值,保留局部梯度最大的像素点,以细化边缘。
    在这里插入图片描述

如上图所示,需要将中心像素与其梯度方向的两个像素进行比较,但是由于图像中的像素点是离散的二维矩阵,其梯度方向上并没有真实存在的像素。对于这个不存在的像素就必须通过对其两侧的点进行插值来得到。
由于利用插值求解梯度值,运算量较大。John Canny在提出Canny算子的论文中,在非极大值抑制时,采用了近似处理的方法。将各点的梯度方向量化到0°、45°、90°、135°。
在这里插入图片描述
如上图所示,量化的过程就是,对你上一步计算出的梯度方向进行处理,如果梯度方向属于区域1,则将它量化为0°;梯度方向属于区域2,则将它量化为45°;梯度方向属于区域3,则将它量化为90°;梯度方向属于区域4,则将它量化为135°。
在这里插入图片描述
上图是非极大抑制示意图,图像以颜色深浅表示梯度幅值大小,经过NMS后,原边缘被细化,意味着** 在真实边缘处是单点响应**。
4. 滞后阈值处理
在使用非极大值抑制后,剩余的像素可以更准确地表示图像中地实际边缘。但是仍然存在由于噪声和颜色变化引起的一些边缘像素。为了解决这个问题,必须用弱梯度值过滤边缘像素,并且保留具有高梯度值的边缘像素。
设置一个高阈值和一个低阈值。
a.如果某一像素点的幅值超过高阈值,则该像素被保留为边缘像素。
b.如果某一像素点的幅值小于低阈值,则该像素被排除。
c.如果某一像素点的幅值在两个阈值之间,则根据连通性来将此像素点分为边缘或者非边缘。具体就是:若该像素与确定为边缘的像素点邻接,则判定为边缘;否则为非边缘。
参考博客:https://blog.csdn.net/leonardohaig/article/details/122141568
代码地址:https://github.com/jinay1991/imagefilters
如有问题欢迎评论区留言。

猜你喜欢

转载自blog.csdn.net/qq_41596730/article/details/127608577
今日推荐