图像边缘检测算法的比较与实现
李娅娅,李志洁,郑海旭,等:图像边缘检测算法的比较与实现2010,31(9)1971
多媒体技术
0引言
边缘检测方法的优劣直接影响着图像特征提取及其它后续处理,是图像预处理中的关键。边缘是指其周围像素灰度发生阶跃变化或屋顶状变化的那些像素的集合,图像的大部分信息都存在于图像的边缘中,主要表现为图像局部特征的不连续性,是图像灰度变化比较剧烈的地方。在一幅图像中,边缘有方向和幅度两个特性。沿边缘走向的灰度变化平缓,而垂直于边缘走向的灰度变化剧烈。边缘检测是对灰度变化的度量与定位,灰度变化的显著程度可以通过导数来度量,即函数导数能够反映图像灰度变化的显著程度,因此边缘检测的一个基本思想就是通过求一阶导数的局部极大值,二阶导数的过零点来体现出来的[1-2]。利用梯度最大值提取边缘点的这种思想产生了许多经典的边缘检测方法如[3-8]:Sobel算法、Log算法、Canny算法等。本文主要针对这3种常用的边缘检测方法分析它们各自的算法性能和特点。
1
边缘检测原理
1.1
基于一阶导数的边缘检测
梯度是函数变化的一种度量,是图像对应二维函数的一
阶导数。而一幅图像可以看作是图像强度连续导数的取样点数组。梯度是一阶导数的二维等价式,
可定义为向量
=
(1)
有两个重要的性质和梯度有关,一是向量G(x,y)的方向就是函数f(x,y)增大时的最大变化率方向(如式(2)所示);二是梯度的幅值(如式(3)所示)。
,
2
2
,
=
arctan
(3)
对于数字图像,偏导数可用差分来近似,则边缘往往在差分值最大处,
最小处或过零点发生。
+1,
,,
,
(4)
在计算梯度时,计算空间同一位置处(x,y)的真实偏导数是至关重要的。而采用上面公式计算的梯度近似值并不位于同一位置。所以常常使用2×2的一阶差分模板来计算位于内插点[x+1/2,y+1/2]的x方向和y方向偏导数,此时Gx和Gy
可表示为
11
111
19722010,31(9)计算机工程与设计ComputerEngineeringandDesign
的点作为边界点的方法,有可能会导致检测出的边缘点过多,数据存储量比较大。一种在理论上更有效的方法是求梯度局部最大值对应的点,并认为它们是边缘点。这种去除了一阶导数中的非局部最大值的方法,可以检测出更精确的边缘,一阶导数的局部最大值对应着二阶导数的零交叉点。这样,通过找图像灰度的二阶导数的零交叉点就能较好地找到精确边缘点。从图1可以看出,图像灰度二阶导数的过零点对应边缘点。
原图:
一阶导数:
二阶导数:
图1图像的二阶导数
2Sobel算法
2.1
算法原理
Sobel算法是基于一阶导数的边缘检测,通过逼近导数来找边缘,其边缘点存在于图像梯度最大值处。Sobel算子中用到了两个卷积模板(一个水平算子,一个垂直算子)。
它是一种奇数大小(3×3)模板下的全方向微分算子,对检测点的上下左右进一步加权。Sobel算子的思想是邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。我们用Sobel来检测边缘的时候,先分别用上述的模板对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的bx,by,它们分别表示图像a中相同位置处的两个偏导数。然后把bx,by对应位置两个数平方后相加得到一个新的矩阵b,b表示图像a中各个像素的灰度的梯度值。最后通过阈值处理和细化处理得到边缘图像。在阈值不为空的情况下,边缘存在于梯度幅值大于阈值平方的点上。
2.2算法流程
Sobel算法的流程图如图2所示,其中的要点归纳如下:(1)用1/8乘Sobel算子来确定模板(水平和垂直算子),即
在水平方向和垂直方向上的梯度值;
(2)利用上述的模板对当前图像a利用imfilter函数进行卷积得到方向导数bx,by;
(3)对方向导数进行平方相加得到梯度幅值,然后通过阈值化操作就能够确定出边缘点。
3Log算法
3.1
算法原理
Log算法是基于二阶导数的边缘检测,这种方法是将高
开始
利用函数im2double(a)将读入的灰度图像a转化为双精度型
初始化边缘e=false(m,n)
用op=fspecial('sobel')/8来产生sobel卷积模板
使用两个有向算子对图像a进行卷积得到偏导数
bx=imfilter(a,x_mask,'replicate');by=imfilter(a,y_mask,'replicate');
用方向因子和偏导数计算梯度值b=kx*bx.*bx+ky*by.*by
true
isempty(thresh)
false
临界值cutoff=scale*mean2(b)thresh=sqrt(cutoff);
cutoff=thresh*thresh
根据梯度值和临界值的比较来确定边缘e(r,c)=(b(r,c)>cutoff)
结束
图2
Sobel算法流程
斯平滑滤波器和拉普拉斯锐化滤波器结合了起来,先平滑掉噪声,再进行边缘检测。它是对图像进行滤波和微分的过程,是利用旋转对称的Log模板与图像做卷积,确定滤波器输出的零交叉位置[7]。常用的Log算子是5×5的模板,如下所示
4
428
0
24848
0
2
是很重要的。直观上说,
大的
值小时,边缘定位精度高,但边缘细节变化多,信噪比低。
因此应根据噪声水平和边缘定位精度的要求来决定
)来
产生滤波算子op;
(2)利用上述的滤波算子op对当前图像a利用imfilter函数进行卷积得到二阶导数b;
(3)根据上述二阶导数以及确定出的阈值判断二阶导数零交叉点并对应一阶导数的较大峰值,二阶导数的过零点初步确定出边缘点;
(4)由于上述检测出来的结果不一定是确定的零点,因此需要用线性内插法在子像素分辨率水平上估计边缘的位置。
李娅娅,李志洁,郑海旭,等:图像边缘检测算法的比较与实现
开始
开始
2010,31(9)1973
用函数im2double(a)将读入的灰度图像a转化为双精度型
用函数im2double(a)将读入的灰度图像a转化为双精度型
初始化边缘e=false(m,n)
初始化边缘e=false(m,n)
设定滤波器宽度pw=1:30;计算滤波器的方差ssq=sigma*sigma用find函数计算滤波算子宽度(要求查找的条件是应大于高斯消失门限)
width=find(exp(-(pw.*pw)/(2*ssq))>GaussianDieOff,1,'last')
定义一维高斯函数gau和二维高斯函数dgau2D
将Log算子op与图像a做卷积,得到一个二阶导数b
b=imfilter(a,op,'replicate')
用图像与高斯滤波器模板卷积计算平滑算子aSmooth=imfilter(a,gau,'conv','replicate');aSmooth=imfilter(aSmooth,gau','conv','replicate');
利用二维高斯函数与平滑算子卷积得到一阶方向偏导数ax,ay.如:
ax=imfilter(aSmooth,dgau2D,'conv','replicate')
计算梯度幅值mag,并对幅值进行归一化
用fspecial函数产生Log模板,fsize是模板的尺寸,sigma
是滤波器的标准差op=fspecial('log',fsize,sigma);
isempty(thresh)
false
true
thresh=.75*mean2(abs(b))
用find函数分别在不同方向上来查询二阶导数的零交叉点,如:
[rx,cx]=find(b(rr,cc)0
&abs(b(rr,cc)-b(rr,cc+1))>thresh);检测出边缘后赋值为1:e((rx+1)+cx*m)=1;
isempty(thresh)
用灰度直方图获得高阈值:首先统计像素的个数counts=imhist(mag,64)
用find函数中条件cumsum(counts)>PercentOfPixelsNotEdges*m*n确定高阈值highThresh,利用lowThresh=0.4*highThresh确定低阈值
利用线性内插法在水平上来查询出精确的零交叉点,
确定出真正的边缘:e(zero(zz))=1
对梯度幅值进行NMS:调用函数cannyFindLocalMaxima(dir,ax,ay,mag)
得到梯度各个方向上的一阶导数的局部极大值点idxLocalMax
通过idxLocalMax(mag(idxLocalMax)>lowThresh)确定低阈值边缘图,并用(idxWeak)=1表明是边缘得到高阈值边缘图idxStrong,并用函数bwselect链接高阈值边缘图,出现断点时,在低阈值边缘图中的8邻点域搜寻边缘点
开始
图3Log算法流程
4Canny算法
使用bwmorph(e,'thin',1)对边缘图进一步细化,使之更清晰
4.1算法原理
Canny方法是基于一阶导数的边缘检测,采用一阶偏导的
结束
有限差分来计算梯度的幅值和方向。Canny算子是一个具有滤波、增强和检测的多阶段的优化算子。在处理图像前,先利用高斯平滑滤波器来平滑图像以除去噪声,然后算法经过一个非极大值抑制的过程,最后采用两个阈值来连接边缘。
在Canny边缘检测算法中,用到了一个重要的双阈值技术。由于只有一个阈值的时候,检测出来的边缘可能存在断点。算法首先利用累计统计灰度直方图得到一个高阈值high-Thresh,然后选取一个低阈值lowThresh。如果图像信号的响应大于高阈值,那么它一定是边缘;如果低于低阈值,那么它一定不是边缘;如果在低阈值和高阈值之间,再检查它的8个邻接像素有没有大于高阈值的边缘。
图4Canny算法流程
卷积模板进行计算。所以在本文中利用2D高斯滤波模板与平滑后的图像aSmooth进行卷积得到x,y方向上的偏导数ax,ay是用imfilter函数来实现的。利用偏导数来计算梯度幅值(mag)和方向
(
=
2
+
2
(8
)
*
£¬¾Í·´Ó³Á˱ßÔµµÄ·½Ïò¡£ÔÚ¾ßÌåʹÓõÄʱºò»¹Òª
½«ÌݶȷùÖµ½øÐйéÒ»»¯£¬µÃµ½Ò»¸öÈ«¾ÖµÄÌݶȷùÖµ¡£(3)对梯度幅值进行非极大抑制。仅仅得到全局的梯度并不足以确定边缘,因此为精确定位边缘,必须保留局部梯度最大的点,即抑制非极大值。Canny算法首先遍历整个图像,若某个像素的梯度幅值与其八邻域的像素点相比较不是最大的,那么这个像素点就不是边缘点,可将该像素的边缘标志赋为0。否则认为该像素是边缘点。即只保留局部梯度幅值部变化最大的点,这就是非极大值抑制的过程,它能产生细化的边缘。
(4)用双阈值算法连接边缘。双阈值法首先对非极大值抑制图像作用双阈值lowThresh和highThresh,得到两个阈值边
缘图像
2
4.2算法流程
Canny算法的流程图如图4所示,其中的要点归纳如下:
(1)用高斯滤波器平滑图像;取高斯函数
22
2
2
(2)根据一阶偏导的有限差分来计算梯度的幅值和方向。已经平滑后的图像梯度可以使用2×2阶有限差分近似式来计算x与y
偏导数的两个阵列
,
=
=
+1,
,
,
+,
+
+1
+1
,
]/2
(6
)
(7)
+1,]/2
(5)
。然后,
在
1
由于对于数字图像,差分可以近似偏导数,而差分一般用
的8个邻接点的位置上搜索可以
19742010,31(9)计算机工程与设计ComputerEngineeringandDesign
连接到轮廓上的边缘点。这样算法不断在
(a)Sobel-
低阈值(b)Sobel-高阈值(c)Sobel-最佳阈值
,它们的确定影响到了检测的
边缘结果,在Canny主要用了几组阈值,例如:如果thresh=[0.06,0.15];由于阈值过大,检测出来的部分边缘丢失。如果thresh=[0.02,0.05];由于阈值过小,检测出来的假边缘点比较多。Canny中,也可以在程序中通过统计灰度直方图来获取阈值,检测的效果较好。在Log算子和Canny算子中很重要的
一个参数是高斯滤波标准差
来产生滤波算子,
本文中是选取来建立高斯函数,
本文中选取的
值小,检测出的边缘点比较集中;反之,
(g)Canny-
低阈值
(h)Canny-高阈值
(i)Canny-最佳阈值
(d)Log-
低阈值
(e)Log-高阈值
(f)Log-最佳阈值
图63种边缘检测算法的结果比较
表1
算子
Sobel
LogCanny
3种边缘检测算法的阈值参数
低阈值0.060.002[0.02,0.05]
高阈值0.120.008[0.06,0.15]
最佳阈值0.080.004[0.0375,0.0938]
和阈值某些程度上要人工获得,但是针对图像选择出比较合适的参数,能够检测出抗噪性较强、定位准的边缘图。
综合比较图6中的3种算法检测结果可以得出以下结论,相比Sobel算法和Log算法,Canny算法检测出来的边缘效果最好,其边缘具有连续性好,噪声小,定位准等优点。对检测结果的比较总结在表2中。
图5
边缘检测原图
6结束语
边缘检测一直是图像处理中的研究热点。实现边缘检测
有很多不同的方法,本文主要针对图像边缘检测中常见的3种算法Sobel,Log,Canny进行分析和比较。从仿真结果来看,Sobel算法采用加权滤波检测出来的边缘图像虽然抗噪性比较好,但是出现间断点多、定位差、误检的缺点。Log算法采用二阶导数的零交叉点检测出来的边缘图像比Sobel算法好,但是检测出的边缘连续性较差,尤其在图像比较复杂时,边缘图像有许多短的边界和孤立点,使图像看起来很不清晰。Canny算法采用非极大抑制和双阈值化技术来精确定位边缘图像,与Sobel算法和Log算法相比,结果更准确更清晰。综合各种因素来考虑,Canny算法是比较理想的边缘检测算法。当然在
李娅娅,李志洁,郑海旭,等:图像边缘检测算法的比较与实现
表2
算子SobelLogCanny
2010,31(9)1975
3种边缘检测算法特性比较
特点
适用范围灰度渐变,低噪声图像噪声较低的图像高噪声图像
采用加权滤波、边缘较宽、间断点较多
利用旋转对称的Log模板与图像做卷积,确定滤波器输出的零交叉位置,能
检测出图像较细的边缘部分
以一阶导数确定边缘点、高定位精度、低误判率、抑制虚假边缘
图像边缘检测中,Canny算法也不是最优的方法,边缘检测的目标是能够更准确,更连续,更清晰的找到边缘点,这也是边缘检测领域研究的主要方向。
[5][6]
(1):54-56.
刑军.基于Sobel算子数字图像的边缘检测[J].微机发展,2005,15(9):48-52.
AbbasiTA,AbbasiMU.AnovelFPGA-basedarchitectureforSobeledgedetectionoperator[J].InternationalJournalofElec-tronics,2007,94(9):889-896.[7]
WangX.Laplacianoperator-basededgedetectors[J].IEEETransactionsonPatternAnalysisandMachineIntelligence,2007,29(5):886-890.[8]
ZhangY,RockettPI.TheBayesianoperatingpointofthecannyedgedetector[J].IEEETransactionsonImageProcessing,2006,15(11):3409-3416.
参考文献:
[1][2][3][4]
ZhangQH,GaoS,BuiTD.Edgedetectionmodels[J].LectureNotesinComputerScience,2005,3656:133-140.
LimDH.Robustedgedetectioninnoisyimages[J].Computa-tionalStatistics&DataAnalysis,2006,50(3):803-812.
段瑞玲,李庆祥,李玉和.图像边缘检测方法研究综述[J].光学技术,2005,31(3):415-419.
马艳,张治辉.几种边缘检测算子的比较[J].工业自动化,2004