1、两种算法原理和区别
关于边缘检测算法,网上有很多种,其中提得最多的就是sobel边缘检测算法和canny边缘检测算法。那两者有什么区别呢?网上有这两种边界检测算法方面资料有很多,但是讲两者的区别没有,而且概念很容易混肴,比如canny边界检测算法中也会用到sobel算子,所以感觉有必要写个文来澄清一下,让喜欢图像处理朋友们能够懂这两个边界检测算法,少走弯路。
sobel边缘检测算法两个步骤:首先用到sobel算子,提取灰度差值信息,也就是图像梯度值,然后用单阀值进一步提取边界信息。
canny边缘检测算法包含四个步骤:高斯滤波,同样计算灰度差值信息,即梯度信息和方向,后面检测边界信息这一块,不是用简单的单阈值方法,而是用了非极大值抑制法排除了不是边界点的信息,同时进一步用了双阈值法提取出强边界和弱边界,为最后做边界连接提供有用的边界点信息。
从上述介绍的sobel边界检测算法和canny边界检测算法,可以看出来,这两种算法都是计算梯度信息和方向,最后根据这个梯度信息进行检测边界,总体流程上师一致的。不同点就是检测这一块,cannny算法给出了非极大值抑制和双阈值法可以排除不是边界点的干扰,更好的能够提取出边界。
了解了sobel检测算法和canny边界检测算法的不同和共同之后,我还想进一步解释一些基本概念,就是什么师sobel算子,什么是x方向梯度幅值,什么是y方向梯度值,什么是图像梯度值,什么是梯度方向,什么是非极大值抑制,什么是双阈值法。了解了这些基本概念,就清楚了sobel边界检测法和canny检测法。
2、梯度相关的基本概念
其中sobel算子有两个方向算子,soble水平和垂直算子。题外话,也可以有45度方向的sobel算子。
利用soble水平和垂直算子与输入图像卷积计算dx、dy,具体公式如下:
进一步可以得到图像梯度的幅值:
为了简化计算,幅值也可以作如下近似:
角度为:
3、非极大值抑制的实现注意点
沿着梯度方向对幅值进行非极大值抑制,而非边缘方向。所以要实现非极大值抑制算法,需要输入梯度的幅值信息和梯度的方向信息。下面是梯度方向和边缘方向的关系图:
图 1
由于梯度的方向信息是0度~360度的,所以在这个梯度方向上没有正好对应的梯度信息,因为像素值本身就是离散的,所以这里需要进行插值,或者近似取得想过值进行比较。
3.1 插值方法:
图 2
进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。图2中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。这就是非极大值抑制的工作原理。
但实际上,我们只能得到C点邻域的8个点的值,而dTmp1和dTmp2并不在其中,要得到这两个值就需要对该两个点两端的已知灰度进行线性插值,也即根据图2中的g1和g2对dTmp1进行插值,根据g3和g4对dTmp2进行插值,这要用到其梯度方向.
3.2、近似比较法
边缘可以划分为垂直、水平、45°、135°4个方向,同样,梯度反向也为四个方向(与边缘方向正交)。因此为了进行非极大值,将所有可能的方向量化为4个方向,如下图:
量化化情况可总结为:
水平边缘--梯度方向为垂直,设置为0:
垂直边缘--梯度方向为水平,设置为1:
135°边缘--梯度方向为45°,设置为2:
45°边缘--梯度方向为135°,设置为3:
在每一点上,领域中心 x 与沿着其对应的梯度方向的两个像素相比,若中心像素为最大值,则保留,否则中心置0,这样可以抑制非极大值,保留局部梯度最大的点,以得到细化的边缘。