欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

「图像处理」Canny边缘检测原理解释

程序员文章站 2024-01-28 09:40:04
...

Canny算子流程:

  1. 图像平滑
  2. 计算边缘的梯度大小、计算边缘的梯度方向
  3. 非极大值抑制(NMS)
  4. 阈值化处理与连接分析

0.边缘检测的一般方法(滤波、增强、检测)

滤波:在实际情况中理想的灰度阶跃及其线条边缘图像是很少见到的,同时大多数的传感器件具有低频滤波特性,这样会使得边缘在拍摄时自带模糊,变为斜坡性边缘,强度变化不是介跃的。

增强:原理上通过像素点倒数的幅值大小,确定增强的具体量,实际上运用算子模版的加减法实现

检测:用阈值法检测边缘,如双峰法、otsu法,直方图法等

1.图像平滑

为什么需要使用高斯函数平滑图像?
「图像处理」Canny边缘检测原理解释
书中给出的原因是:先从一维说起,对于加性高斯白噪声污染后的一维台阶边缘,使用高斯一阶导数是一个较好的近似,之后将一维推广到二维,得到了同样的结论。

我的理解:现在的CCD技术突飞猛进,在照片从拍摄到供人们在不同设备上进行观看的这个过程中,并不会出现十分明显的噪声,所以使用二维高斯高通滤波的原因并不能局限于噪声的去除,应该考虑的是均匀图像的明暗背景,适当锐化图像的边缘。

他人的理解: 在实际情况中理想的灰度阶跃及其线条边缘图像是很少见到的,同时大多数的传感器件具有低频滤波特性,这样会使得阶跃边缘变为斜坡性边缘,看起来其中的强度变化不是瞬间的,而是跨越了一定的距离。这就使得在边缘检测中首先要进行的工作是滤波

2.计算边缘梯度大小与方向

这一环节,我们需要计算的东西有四个,P[i, j], Q[i, j], M[i, j], ∂[i, j],这些后面会说明,PQM∂每一个计算的结果都是一个矩阵,需要记住的是四个计算集结果都与图像的分辨率大小相同。

具体计算,将梯度大小的求导运算简化为加减法,得出canny算子的模版如下:
「图像处理」Canny边缘检测原理解释
之后通过Sy,Sx计算得到四个属性:
「图像处理」Canny边缘检测原理解释
P[i, j]矩阵:用来衡量图片在x方向上的梯度变化幅度
Q[I, j]矩阵:用来衡量图片在y方向上的梯度变化
M[i, j]矩阵:用QP计算出来形容边缘梯度大小的矩阵,也是每个点在xy方向上综合的梯度幅值
∂[I, j]:用来在∂方向上抑制非极大值

3.对梯度幅值进行非极大值抑制

在M矩阵中,矩阵内的元素越大,说明图像的梯度在这点梯度越大,但是并不能说明这点就是图像的边缘,仅能说明图像在增强过程中在这点取得了好的结果。非极大值抑制要做的事情就是找到像素点局部的最大值,之后将比它小的值置0。

Q1: 那么如何确定这点是图像的边缘呢?
给出一个3x3的模版,利用这个模板在M矩阵中滑动,找到一个中心点C
「图像处理」Canny边缘检测原理解释
现在的∂角度就可以派上用场了,这样我们就不需要判断完整的8邻域内的所有方向了。那么如何判断是否抑制?很简单,只需要将C点周围的两个梯度相加起来

									∑ = C +dTmp1 + dTmp2

找到最大的∑即可,其余的梯度方向都被抑制,就如上图,我们只需要在(g1, g2)(g3, g4)的区间内再次精确就完成了边缘方向的判断,需要注意的是,梯度方向与真正的边缘方向是垂直的。

Q2: 那么如何在区间内精确梯度方向呢?∂角度的方向不已经是梯度的方向了吗?

这个问题可以被更加精确的描述为“当前梯度值在计算出的梯度方向上是局部最大的吗?”回答是并不一定,需要进行与周围的梯度值进行实际比较,如果周围有值∑大于了角度确定的梯度,那么说明了角度确定的理论梯度不合格,需要将它抑制

Q2: 如何与周围的梯度进行比较?
进行区域内部(g1, g2)和(g3, g4)的插值,用填充过的区域进行搜索。进行NMS抑制,抑制的结果为二值图像,可还是存在噪声与假边缘,需要进行双阈值算法检测

4.边缘检测

终于到了最后一步,双阈值算法检测和边缘的连接,为什么需要两个阈值呢?
1)高阈值的作用是为了区分物体与边界,把边缘连接为了轮廓;
2)低阈值的作用是让图像在高阈值间断处闭合起来,起到平滑曲线的作用;

以上为canny边缘检测的分析过程,还有很多不足的地方,希望和大家交流。

参考资料:
《数字图像处理》
https://blog.csdn.net/likezhaobin/article/details/6892176
https://blog.csdn.net/Lay_ZY/article/details/78264886
https://www.cnblogs.com/love6tao/p/5152020.html