https://blog.csdn.net/lyl771857509/article/details/79088321
4)Canny算法所采用的方法
在本文实现的Canny算法中所采用的卷积算子比较简单,表达如下:
其x向、y向的一阶偏导数矩阵,梯度幅值以及梯度方向的数学表达式为:
M是模的大小
θ是角度
求出这几个矩阵后,就可以进行下一步的检测过程。
根据图1 可知,要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。
图1中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。这就是非极大值抑制的工作原理。
作者认为,在理解的过程中需要注意以下两点:
1)中非最大抑制是回答这样一个问题:“当前的梯度值在梯度方向上是一个局部最大值吗?” 所以,要把当前位置的梯度值与梯度方向上两侧的梯度值进行比较;
2)梯度方向垂直于边缘方向。
但实际上,我们只能得到C点邻域的8个点的值,而dTmp1和dTmp2并不在其中,要得到这两个值就需要对该两个点两端的已知灰度进行线性插值,也即根据图1中的g1和g2对dTmp1进行插值,根据g3和g4对dTmp2进行插值,这要用到其梯度方向,这是上文Canny算法中要求解梯度方向矩阵Thita的原因。
完成非极大值抑制后,会得到一个二值图像,非边缘的点灰度值均为0,可能为边缘的局部灰度极大值点可设置其灰度为128。根据下文的具体测试图像可以看出,这样一个检测结果还是包含了很多由噪声及其他原因造成的假边缘。因此还需要进一步的处理。
3)双阈值检测
根据图像选取合适的高阈值和低阈值,通常高阈值是低阈值的2到3倍
(2) 如果某一像素的梯度值高于高阈值,则保留
(3) 如果某一像素的梯度值低于低阈值,则舍弃
(4) 如果某一像素的梯度值介于高低阈值之间,则从该像素的8邻域的寻找像素梯度值,如果存在像素梯度值高于高阈值,则保留,如果没有,则舍弃
总结:Canny在前期计算中会计算幅值,和梯度值(角度值),非极大值抑制通过目标点的梯度值并结合八邻域计算在梯度方向上目标值的幅值是否最大,一般八邻域不包含梯度方向值,需要使用线性插值获取。最后再采用双阈值检测减少偏差。