图像边缘是图像的重要特征,是图像中特性(如像素灰度、纹理等)分布的不连续处,图像周围特性有阶跃变化或屋脊状变化的那些像素集合。图像的边缘部分集中了图像的大部分信息,一幅图像的边缘结构与特点往往是决定图像特质的重要部分。图像边缘的另一个定义是指其周围像素灰度变化不连续的那些像素的集合。边缘广泛存在于物体与背景之间、物体与物体之间,因此,边缘是图像分割、图像理解及图像识别的重要特征。
图像边缘检测主要用于增强图像中的轮廓边缘、细节以及灰度跳变部分,形成完整的物体边界,达到将物体从图像中分离出来或将表示同一物体表面的区域检测出来的目的。目前为止最通用的方法是检测亮度值的不连续性,用一阶和二阶导数检测的。
(1)微分法
微分法的目的是利用微分运算求信号的变化率,加强高频分量的作用,从而使轮廓清晰。遵循如下两个基本准则之一:找到亮度的一阶导数在幅度上比指定的阈值大的地方;找到亮度的二阶导数有零交叉的地方。
(2)差分边缘检测方法
利用像素灰度的一阶导数算子在灰度迅速变化处得到高值来进行奇异点的检测。它在某一点的值就代表该点的边缘强度,通过对这些值设置阈值来进一步得到边缘图像。差分边缘检测方法是最原始、最基本的方法。但要求差分方向与边缘方向垂直,这就需要对图像的不同方向(一般为垂直方向、水平方向和对角线方向)都进行差分运算,增加了实际运算的繁琐性,目前很少采用。
(3)Roberts边缘检测算子
Roberts边缘检测算子根据任意一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差然后计算出Roberts的梯度幅度值.
Roberts检测器较为简单,但具有一些功能上的限制,例如,它是非对称的,而且不能检测诸如45°倍数的边缘。然而,它还是经常用于硬件实现中,因为它既简单又快速。
(4)Sobel边缘检测算子
对数字图像的每个像素,考察它上下左右邻点灰度的加权差,与之接近的邻点的权大。
Sobel算子很容易在空间上实现,边缘检测效果较好,且受噪声的影响也较小。邻域增大抗噪性会更好,但计算量也会增大,得出的边缘也会相应变粗。Sobel算子会检测出许多伪边缘,边缘定位精度不够高,在精度要求不高时是一种较常用的边缘检测方法。
(5)Prewitt边缘检测算子
图像中的每个像素都用这两个核作卷积,一个核对垂直边缘影响最大,另一个核对水平边缘影响最大。两个卷积的绝对值的最大值作为该点的输出值。不能简单的将小于0的值处理为0,这样会丢失信息。它比Sobel检测器在计算上要简单一些,但比较容易产生一些噪声。
(6)拉普拉斯边缘检测算子
拉普拉斯边缘检测算子是一种二阶微分算子,与其它边缘检测方法的不同之处在于,该方法是一种各向同性的检测方法,即其边缘的增强程度与边缘的方向无关,从而可以满足不同走向的边缘锐化的要求。
拉普拉斯算子自身很少被直接用作边缘检测,因为二阶导数对噪声具有无法接受的敏感性,它的幅度会产生双边缘,而且它不能检测边缘的方向。然而,当与其它边缘检测技术组合使用时,拉普拉斯算子是一种有效的补充方法。例如,虽然它的双边缘使得它不适合直接用于边缘检测,但该性质可用于边缘定位。
在MATLAB中可以由edge函数实现各算子对边缘的检测,其调用格式为:
BW = edge(I,’METHOD’)—自动选择阈值用指定的算子进行边缘检测;
BW = edge(I,’METHOD’,THRESH)—根据给定的阈值THRESH用指定的算子进行边缘检测,忽略所有小于阈值的边缘。当THRESH为空时,自动选择阈值;
[BW, THRESH] = edge(I,’METHOD’,…)—返回edge使用的阈值,以确定哪个梯度值足够大到可以称为边缘点。
其中,I为输入图像。返回图像BW为与I同大的二值图像,1表示边缘,0表示非边缘。I是unit8型、unit16型,或者是double型,BW是unit8型。
METHOD:使用检测算子的类型,经常使用的有:
sobel:缺省值,用导数的sobel近似值检测边缘,那些梯度最大的点返回边缘。
roberts:用导数的roberts近似值检测边缘,那些梯度最大的点返回边缘。
prewitt:用导数的prewitt近似值检测边缘,那些梯度最大的点返回边缘。
LoG:用LoG算子检测边缘。
Canny:用Canny算子检测边缘。
THRESH:指定的阈值,所有不强于thresh的边缘都被忽略。
由edge函数实现各算子对图像的边缘检测
clear all;
I = imread('d:\office.bmp');
I=rgb2gray(I);
BW1 = edge(I,'sobel'); %利用Sobel算子进行边缘检测
BW2 = edge(I,'roberts'); %利用roberts算子进行边缘检测
BW3 = edge(I,'prewitt'); %利用prewitt算子进行边缘检测
BW4 = edge(I,'log'); %利用log算子进行边缘检测
BW5 = edge(I,'canny'); %利用canny算子进行边缘检测
subplot(2,3,1),imshow(I)
subplot(2,3,2),imshow(BW1)
subplot(2,3,3),imshow(BW2)
subplot(2,3,4),imshow(BW3)
subplot(2,3,5),imshow(BW4)
subplot(2,3,6),imshow(BW5)