改进的自适应Canny边缘检测算法
2018-06-19段锁林殷聪聪李大伟
段锁林,殷聪聪,李大伟
(常州大学 机器人研究所,江苏 常州 213164)
0 引 言
边缘检测是很多其它图像处理技术的基础[1]。传统的边缘检测算法有Roberts、Sobel、Prewitt、Kirsch、Canny等。其中Canny算法相对于其它几种算法具有较好的去噪能力和较高的检测精度,应用范围较广[2]。但是,传统Canny算法存在需要设定参数、椒盐噪声环境下检测效果不佳等问题。近年来,许多学者针对Canny算法存在的问题进行了改进。文献[3]提出用窗口大小为3×3的改进后中值滤波器替代高斯滤波器,减少了运算量,但是对不同程度的椒盐噪音适应性较差且对高斯噪声的滤波效果不佳;文献[4,5]提出用自适应中值滤波器替代高斯滤波器,对椒盐噪声自适应性较好,但是运算量较大,对高斯噪声的去噪效果不佳;文献[3,6]在计算梯度时将模板扩大为3×3,增加计算45°和135°方向的梯度,增加了算法的抗噪性,但是没有充分利用45°和135°方向的数据来计算梯度的方向;文献[4,7]引入Otsu算法根据像素梯度值的分布情况计算高、低阈值,增加了算法的自适应性,但是传统Otsu算法需要遍历每个像素梯度等级来确定最大类间方差值,效率较低。
针对上述问题,通过改进自适应中值滤波器、增加梯度计算模板和在Otsu算法中引入二分查找法等手段来改进传统Canny算法。实验结果表明,该算法在椒盐噪声和高斯噪声环境下都有较好的边缘检测效果,自适应性强,在一定程度上减少了算法的计算机耗时。
1 传统Canny算法存在的问题
(1)Canny算法采用二维零均值高斯滤波器对图像进行去噪处理,滤波器函数表达式如下
(1)
式中:σ——高斯滤波器分布参数,当σ取值较小时,边缘定位精度较高,但抑制噪声能力差。在噪声较大时,需要增大σ的值和增大模板,但会使边缘位置偏离实际位置,边缘定位精度降低[8]。因此,需要根据图像含有噪声的具体情况人为设置σ的取值大小,同时,高斯滤波器对椒盐噪声的滤波效果不佳。
(2)传统Canny算法采用2×2大小的模板来计算平滑后灰度图像的梯度幅值和梯度方向。其中,点(i,j)处的灰度值为I(i,j),则水平和垂直两个方向上的梯度值分别为
Gx(i,j)=[I(i,j+1)-I(i,j)+I(i+1,
j+1)-I(i+1,j)]/2
(2)
Gy(i,j)=[I(i,j)-I(i+1,j)+I(i,
j+1)-I(i+1,j+1)]/2
(3)
此时,点(i,j)处的梯度幅值G(i,j)和梯度方向θ(i,j)分别为
(4)
(5)
由于采用了2×2梯度计算模板,使得对噪声比较敏感,容易检测出很多伪边缘和丢失真实边缘,造成边缘定位精度降低,并且所计算出来的其实是内插点(i+1/2,j+1/2)处的梯度幅值和方向[6]。
(3)传统Canny算法根据双阈值从候选边缘点中寻找最终的边缘点。双阈值的选择需要根据图像梯度分布的具体情况预先设定高阈值Th和低阈值Tl。对于边缘强度不同的图像,用同一组高、低阈值分割,效果相差很大[9]。因此,传统Canny算法对边缘强度分布不同的图像,适应性差。
2 改进的自适应Canny边缘检测算法
针对上文所分析的问题,在已有的改进方法基础之上,提出了进一步的改进方法,旨在提高边缘检测算法的自适应性,降低运算量,提高算法的实时性。
2.1 改进的自适应中值滤波算法
传统中值滤波是基于数据整体排序的方法找出最大值、最小值和中值,随着滤波窗口的增大,运算量会急剧增加,并且对高斯噪声的滤波效果不佳。利用分治法思想和相邻窗口排序信息相关性的原理改进传统自适应中值滤波器,可以大大减小排序时的比较次数,再结合IMF(improved median filter)算法可以使其对高斯噪声也具有较好的滤波效果[10]。具体改进方法如下:
设滤波窗口为Wn,窗口中像素点的灰度值为aij,则有
(6)
首先利用分治法思想对Wn中元素进行排序[11]。将Wn中每一列分别进行由小到大排列得到新的矩阵Xn,使得Xn的第1行为Wn中每一列的最小值,第2n-1行为Wn中每一列的最大值,第n行为Wn中每一列的中值。接着对Xn中的第1行、第n行和第2n-1行分别进行由小到大排列得到矩阵Yn,则Yn中的a11和a(2n-1)(2n-1)分别是Wn中的最小值和最大值,ann是Wn中的近似中值。实验结果表明,这样得到的近似中值不影响滤波效果。若滤波窗口为N×N,则传统中值滤波算法最坏需要N2(N2-1)/2次比较才能找到中值,通过上述改进后最坏只需要N(N-1)(N+3)/2次比较计算。
为了进一步降低运算量,提高算法实时性,根据相邻滤波窗口排序信息相关性的原理,利用前一个滤波窗口已排列好的数据代入下一个滤波窗口,减少下一个滤波窗口的比较次数。设当前滤波窗口为经过上文重新排序后的Y(i,j),下一个滤波窗口为沿水平方向往右移动一个像素点的Y(i,j+1)。如图1所示,Y(i,j+1)为Y(i,j)移除其第1列数据,同时移入下一列新像素构成的新的滤波窗口。
图1 滤波窗口平移
由于新的滤波窗口Y(i,j+1)中除了最后一列是新移入的数据,其它每一列都是在Y(i,j)中已经排序好的数据,所以只要将Y(i,j+1)中最后一列数据由小到大排序后,再把Y(i,j+1)第1行、第n行和第2n-1行分别进行由小到大排列,即可得到最小值、最大值和近似中值。由于Y(i,j+1)中第1行、第n行和第2n-1行的前2n-2个数据在Y(i,j)中已经排列好了,是一组有序的数据,所以最坏只需要2n-2次比较即可完成排序。结合上一步的改进方法,对于大小为N×N的滤波窗口最坏只需要N(N-1)/2+3(N-1)次比较就可以找到最小值、最大值和近似中值。由此可知,改进后算法第1步迭代计算的复杂度为O(N3)=N(N-1)(N+3)/2,第2至k步迭代计算的复杂度为O(N2)=N(N-1) /2+3(N-1)。当迭代次数k远大于1时,改进后算法最差平均复杂度为O(N2)。而传统中值滤波的复杂度为O(N4)=N2(N2-1)/2。可见,改进后的算法复杂度由O(N4)降低到了O(N2),大大降低了运算量。以大小为5×5的滤波窗口为例,Y(i,j+1)最坏只需要进行3×(5-1)+5×(5-1)/2=22次比较即可得到最小值、最大值和近似中值。相对于传统中值滤波的25(25-1)/2=300,改进后的算法把比较次数减小到原来的1/13左右,且窗口越大越能体现出该改进方法的优势。
通过上述改进后,可以快速找到窗口内的最小值、最大值和近似中值。接着,借用文献[10]中提到的IMF算法思想对窗口的像素点的灰度值做加权平均,目的是使滤波器对高斯噪声也有一定的滤波效果。假设滤波窗口大小为N×N,对像素点(m,n)进行滤波。先用上文改进后的方法找到窗口内的最小值amin、最大值amax和近似中值amed,然后计算出窗口内各像素灰度值a(i,j)与amed的方差D(i,j),接着使用如下公式计算各像素点灰度的权重r(i,j)
(7)
最后的滤波输出为
(8)
经过上述改进后的自适应中值滤波结合了均值滤波的优点,在加权求和时像素点的灰度值与中值相差越大,其权重越小,这样不仅可以滤去椒盐噪声,还可以抑制高斯噪声。
改进后的自适应中值滤波具体实施步骤如下:
步骤1 设滤波窗口大小为w=3;
步骤2 按改进后的方法计算当前窗口内灰度值的最小值amin、最大值amax和近似中值amed;