摘 要 针对Sobel算子检测边缘定位不准的问题,提出结合Butterworth高通滤波器和Sobel算子边缘检测的方法,有效地解决这一的问题。在VC++环境下编程实现该方法,实验结果验证了所提方法的有效性。
关键词 边缘检测;Butterworth滤波器;Sobel算子
1 引言
图像边缘是一种重要的视觉信息,图像边缘检测是图像处理、图像分析、模式识别、计算机视觉以及人类视觉的基本步骤。其结果的正确性和可靠性将直接影响到机器视觉系统对客观世界的理解。
实现边缘检测有很多不同的方法,也一直是图像处理中的研究热点,人们期望找到一种抗噪强、定位准、不漏检、不误检的检测算法。经典的算法[1-2]中主要用梯度算子,最简单的梯度算子是Roberts算子,比较常用的有Prewitt算子和Sobel算子,其中Sobel算子效果较好,但是经典Sobel算子存在边缘定位不准的缺点,文[3-4]对其作了描述和改进,本文提出另一种改进方法。
2 Sobel算子特点分析
Sobel边缘检测算子使用两个如下有向算子(一个水平的,一个是垂直的),每一个逼近一个偏导数:
Dxf(x,y)={f(x+1,y-1)+2f(x+1,y)+f(x+1,y+1)}-{f(x-1,y-1)+2f(x-1,y)+f(x-1,y+1)}
Dyf(x,y)={f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1)}-{f(x-1,y-1)+2f(x,y-1)+f(x+1,y-1)}
如果用Sobel算子检测图像M的边缘的话,可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的图像M1,M2,他们分别表示图像M中相同位置处的两个偏导数。然后把M1,M2对应位置的两个数平方后相加得到一个新的矩阵G,G表示M中各个像素的灰度的梯度值(一个逼近)。这样就可以通过阀值处理得到边缘图像。
Sobel算子利用像素的左、右、上、下邻域的灰度加权算法,根据在边缘点处达到极值这一原理进行边缘检测。该方法不但产生较好的检测效果,而且对噪声具有平滑作用,可以提供较为精确的边缘方向信息。但是,在抗噪声好的同时也存在检测到伪边缘,定位精度不高的缺点。如果在Sobel算子处理图像之前对图片进行预处理,突出图片的边缘线条部分,那么再经Sobel算子运算后的边缘线条将会精确得多,而Sobel算子的噪声抑制作用也得到保存。所以有必要先对图像作增强的预处理。
3 Butterworth滤波预处理
图像中的边沿或线条与图像频谱中的高频分量相对应,因此,可以采用高通滤波的方法,使低频分量得到抑制,从而达到增强高频分量,使图像的边沿或线条变得清晰,完成图像的预处理。
常用的高通滤波器有:理想高通滤波器、Butterworth高通滤波器、指数形高通滤波器。理想高通滤波器的滤波效果最好,但其位于D0的阶跃会对图像产生大量的噪声点。指数高通滤波器相对理想高通滤波器来说要好一些,但其截止部分仍过于陡峭,这点仅经高通滤波后难以察觉,但在之后的Sobel算子处理后会产生大量噪声点,而Butterworth滤波器则相对较为平滑,且可由阶数来控制曲线形状。
Butterworth滤波器的转移函数为:

其中D0为截止频率。阶数n控制曲线的形状,即决定了函数的衰减率。由于在高低频率间的过渡比较平滑,所以用Butterworth滤波器得到的输出图其振铃效应不明显。为此,预处理程序采用Butterworth高通滤波器比较适合。
4 实验结果及讨论
下面就用本文提出的方法,先对图像进行Butterworth高通滤波器预处理,再对预处理后的图像采用Sobel算子进行边缘检测。我们在Windows 2000下,用Visual C++ 6.0编程环境实现了该方法,对常用的“lena图像”分别用Sobel算子和本文提出的方法进行边缘检测,其结果显示如图1:
