「图像处理」Canny边缘检测原理解释
Canny算子流程:
- 图像平滑
- 计算边缘的梯度大小、计算边缘的梯度方向
- 非极大值抑制(NMS)
- 阈值化处理与连接分析
0.边缘检测的一般方法(滤波、增强、检测)
滤波:在实际情况中理想的灰度阶跃及其线条边缘图像是很少见到的,同时大多数的传感器件具有低频滤波特性,这样会使得边缘在拍摄时自带模糊,变为斜坡性边缘,强度变化不是介跃的。
增强:原理上通过像素点倒数的幅值大小,确定增强的具体量,实际上运用算子模版的加减法实现
检测:用阈值法检测边缘,如双峰法、otsu法,直方图法等
1.图像平滑
为什么需要使用高斯函数平滑图像?
书中给出的原因是:先从一维说起,对于加性高斯白噪声污染后的一维台阶边缘,使用高斯一阶导数是一个较好的近似,之后将一维推广到二维,得到了同样的结论。
我的理解:现在的CCD技术突飞猛进,在照片从拍摄到供人们在不同设备上进行观看的这个过程中,并不会出现十分明显的噪声,所以使用二维高斯高通滤波的原因并不能局限于噪声的去除,应该考虑的是均匀图像的明暗背景,适当锐化图像的边缘。
他人的理解: 在实际情况中理想的灰度阶跃及其线条边缘图像是很少见到的,同时大多数的传感器件具有低频滤波特性,这样会使得阶跃边缘变为斜坡性边缘,看起来其中的强度变化不是瞬间的,而是跨越了一定的距离。这就使得在边缘检测中首先要进行的工作是滤波。
2.计算边缘梯度大小与方向
这一环节,我们需要计算的东西有四个,P[i, j], Q[i, j], M[i, j], ∂[i, j],这些后面会说明,PQM∂每一个计算的结果都是一个矩阵,需要记住的是四个计算集结果都与图像的分辨率大小相同。
具体计算,将梯度大小的求导运算简化为加减法,得出canny算子的模版如下:
之后通过Sy,Sx计算得到四个属性:
P[i, j]矩阵:用来衡量图片在x方向上的梯度变化幅度
Q[I, j]矩阵:用来衡量图片在y方向上的梯度变化
M[i, j]矩阵:用QP计算出来形容边缘梯度大小的矩阵,也是每个点在xy方向上综合的梯度幅值
∂[I, j]:用来在∂方向上抑制非极大值
3.对梯度幅值进行非极大值抑制
在M矩阵中,矩阵内的元素越大,说明图像的梯度在这点梯度越大,但是并不能说明这点就是图像的边缘,仅能说明图像在增强过程中在这点取得了好的结果。非极大值抑制要做的事情就是找到像素点局部的最大值,之后将比它小的值置0。
Q1: 那么如何确定这点是图像的边缘呢?
给出一个3x3的模版,利用这个模板在M矩阵中滑动,找到一个中心点C
现在的∂角度就可以派上用场了,这样我们就不需要判断完整的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
上一篇: 图像边缘检测 Canny边缘检测