最近有用到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。
联系客服