几种常用边缘检测算法的比较
摘要: 边缘是图像最基本的特征,边缘检测是图像分析与识别的重要环节。基于微分算子的边缘检测是目前较为常用的边缘检测方法。通过对Roberts,Sobel,Prewitt,Canny 和Log 及一种改进Sobel等几个微分算子的算法分析以及MATLAB 仿真实验对比,结果表明,Roberts,Sobel 和Prewitt 算子的算法简单,但检测精度不高,Canny 和Log 算子的算法复杂,但检测精度较高,基于Sobel的改进方法具有较好的可调性,可针对不同的图像得到较好的效果,但是边缘较粗糙。在应用中应根据实际情况选择不同的算子。
0 引言
边缘检测是图像分析与识别的第一步,边缘检测在计算机视觉、图像分析等应用中起着重要作用,图像的其他特征都是由边缘和区域这些基本特征推导出来的,边缘检测的效果会直接影响图像的分割和识别性能。边缘检测法的种类很多,如微分算子法、样板匹配法、小波检测法、神经网络法等等,每一类检测法又有不同的具体方法。目前,微分算子法中有Roberts,Sobel,Prewitt,Canny,Laplacian,Log 以及二阶方向导数等算子检测法,本文仅将讨论微分算子法中的几个常用算子法及一个改进Sobel算法。
1 边缘检测
在图像中,边缘是图像局部强度变化最明显的地方,它主要存在于目标与目标、目标与背景、区域与区域( 包括不同色彩) 之间。边缘表明一个特征区域的终结和另一特征区域的开始。边缘所分开区域的内部特征或属性是一致的,而不同的区域内部特征或属性是不同的。边缘检测正是利用物体和背景在某种图像特征上的差异来实现检测,这些差异包括灰度、颜色或纹理特征,边缘检测实际上就是检测图像特征发生变化的位置。边缘的类型很多,常见的有以下三种: 第一种是阶梯形边缘,其灰度从低跳跃到高; 第二种是屋顶形边缘,其灰度从低逐渐到高然后慢慢减小; 第三种是线性边缘,其灰度呈脉冲跳跃变化。如图1 所示。
(a) 阶梯形边缘 (b) 屋顶形边缘
(b) 线性边缘
图像中的边缘是由许多边缘元组成,边缘元可以看作是一个短的直线段,每一个边缘元都由一个位置和一个角度确定。边缘元对应着图像上灰度曲面N 阶导数的不连续性。如果灰度曲面在一个点的N 阶导数是一个Delta 函数,那么就定义灰度曲面在这个点是N 阶不连续,则线性边缘是0 阶不连续,阶梯形边缘是一阶不连续,而屋顶形边缘是二阶不连续。在实际中,单纯的阶跃和线性边缘图像是很少见的,由于大多数传感元件具有低频特性,使得阶跃边缘变成斜坡形边缘,线性边缘变成屋顶形边缘。
边缘检测可分为滤波、增强、检测、定位四个步骤,由于微分边缘检测算法主要是基于图像强度的一阶和二阶导数,而导数的计算对噪声很敏感,噪声的存在可能会使检测到的边缘变宽或在某些点处发生间断,因此,需要使用滤波器来滤掉噪声。大多数滤波器在降低噪声的同时也会引起边缘强度的损失,增强图像边缘可以弥补损失,但增强边缘和降低噪声之间需要折衷。在边缘检测算法中,前三个步骤用得十分普遍,这是因为在大多数情况下,只需要边缘检测器指出边缘出现在图像中某一像素点的附近即可,而没有必要指出边缘的精确位置。
2 微分边缘检测算子
2.1一阶微分算子
2.1.1 Roberts 算子
Roberts 算子是一种利用局部差分算子寻找边缘的算子, 它由下式给出:
(1)
其中,、、和分别为4领域的坐标,且是具有整数像素坐标的输入图像。
Robert算子是算子模板。图2所示的2个卷积核形成了Roberts算子。图像中的每一个点都用这2个核做卷积。
图2 Roberts算子
Roberts 算子边缘定位精度较高,但容易丢失一部分边缘,同时由于没有经过图像平滑计算,因此不能抑制噪声,该算子对具有陡峭的低噪声图像响应较好。
2.1.2 Sobel算子
Sobel算子是一种一阶微分算子,它利用像素临近区域的梯度值来计算1个像素的梯度,然后根据一定的阈值来取舍。它由下式给出:
(2)
Sobel算子是算子模板。图3所示的2个卷积核、形成Sobel算子。一个核通常的垂直边缘响应最大,而另一个核对水平边缘响应最大。2个卷积的最大值作为该点的输出值。运算结果是一幅边缘幅度图像。
图3 Sobel算子
2.1.3 Prewitt 算子
Prewitt 算子由下式给出:
(3)
Prewitt算子是算子模板。图4所示的2个卷积核和形成了Prewitt算子。与Sobel算子的方法一样,图像中的每个点都用这2个核进行卷积。取最大值作为输出值。Prewitt算子也产生一副边缘幅度图像。
图4 Prewitt算子
2.1.4 Canny 算子
传统的Canny算法是通过在邻域内求有限差分来计算梯度幅值。Canny算子法实现的方式为:图像先用2D高斯滤波模板进行卷积以消除噪声,再对滤波后图像中的每个像素计算其梯度的大小和方向。计算可采用以下大小的模板作为对方向和方向偏微分的一阶近似:
由此得到梯度的大小M和方向:
通过梯度的方向,可以找到这个像素梯度方向的邻接像素:
最后通过非最大值抑制以及阈值化和边缘连接。Canny算子有信噪比准则、定位精度准则和单边缘响应准则。Canny算法的实质是用一个准高斯函数做平滑运算,然后以带方向的一阶微分算子定位导数最大值,它可用高斯函数的梯度来近似,在理论上很接近k 个指数函数的线性组合形成的最佳边缘算子。它是一阶传统微分中检测阶跃性边缘效果最好的算子之一,它比Prewitt 算子、Sobel 算子的去噪能力都要强,但它也容易平滑掉一些边缘信息,其检查方法较为复杂。
2.1.5 一种改进的Sobel算子
基于Sobel算子,。为了能够更准确地描述出图像边缘点,减少噪声对检测结果的影响,提高算子的抗噪能力,重新构造了4个5×5大小的模板,模板中各个位置的权重是由该位置到中心点的距离以及该位置在模板中所在的方位决定的,等距离的点,具有相同的权重。最后选择有最高输出模板所对应边缘梯度值来作为像元的边缘梯度强度。改进Sobel算子如图5所示:
(1)、x水平方向 (2)、y垂直方向
(3)、方向 (4)、方向
图5 方向模板
由一阶梯度算子得到图像的梯度图像。一般来说,其边缘较粗。若直接对梯度图像设定阈值进行二值化,很难找到合适的阈值,使得检测出来的边缘达到要求,这不便于边缘连接与边缘特征提取等后期处理。因此在对图像梯度图像进行二值化前,有必要对所检测出来的梯度边缘进行细化处理。细化处理可以通过找出像素点(m,n)某个邻域中的最大值Max(m,n),根据Max(m,n)来局部设定阈值。按照该点梯度值与阈值的关系对该点进行取舍,这样就能达到将梯度图细化的目的。计算式如下:
式中:grade(m,n)为像素点(m,n)对应的梯度值;Max(m,m)为(m,n)点8邻域最大梯度值;a为控制因子,0<a<1,通过选取不同的a值.可以控制边缘的宽度。
2.2 二阶微分算子
2.2.1 Laplacian 算子
拉普拉斯二阶零交叉(zerocross)算子是利用边缘点处二阶导函数出现零交叉原理来检测边缘。函数的拉普拉斯算子公式为:
使用差分方程对x和y方向上的二阶偏导数近似如下:
这一近似式是以点[i,j+1]为中心的。用j-1替换j,得到以点[i,j]为中心的二阶偏导数的理想近似式:
(1)
类似地,可得:
(2)
把(1)、(2)式合并可得能用来近似表达拉普拉斯算子的模板:
当拉普拉斯算子输出出现过零点时就表明有边缘存在,其中忽略无意义的过零点(均匀零区) 。原则上,过零点的位置精度可以通过线性内插方法精确到子像素的分辨率,不过由于噪声,结果可能不会很精确。拉普拉斯算子不具方向性,对灰度突变敏感,定位精度较高,同时,对噪声也敏感。Laplacian算子一般不以其原始形式用于边缘检测。
2.2.2 LOG 算子
正如上面所提到的,利用图像强度二阶导数的零交叉点来求边缘点的算法对噪声十分敏感,所以,希望在边缘增强前滤除噪声。将高斯滤波器和拉普拉斯零交叉算子结合在一起就形成了Log 算子。Log 算子实现的方式有两种: 一种是图像先与高斯滤波器进行卷积,再求卷积的拉普拉斯变换; 另一种是先求高斯滤波器的拉普拉斯变换,再求与图像的卷积。Log 边缘检测器的基本特征是: ①平滑滤波器是高斯滤波器; ②增强步骤采用二阶导数(二维拉普拉斯函数) ; ③边缘检测判据是二阶导数零交叉点并对应一阶导数的较大峰值; ④使用线性内插方法在子像素分辨率水平上估计边缘的位置。Log算子的输出可通过卷积运算得到:
根据卷积求导法有:
其中,
Log 算子法既平滑了图像又降低了噪声,由于平滑会导致边缘的延展,因此边缘检测器只考虑那些具有局部梯度最大值的点为边缘点,这一点可以用二阶导数的零交叉点来实现。为了避免检测出非显著边缘,选择一阶导数大于某一阈值的零交叉点作为边缘点。
3 MATLAB仿真
MATLAB图像处理工具中有多种边缘检测算子函数,利用MATLAB edge 函数,得以下实验结果:
针对图片细节少的rice图片,结果如下:
针对细节较多的camera图,程序运行结果如下:
各算子的MATLAB 检测函数均未带滤波器,阈值为观察到检测结果为最优的阈值。从以上可以看出,Prewitt 算子和Sobel 算子具有平滑作用,但定位精度不高。Roberts 算子定位比较精确,但没有平滑作用。Log 算子具有平滑作用,但边缘有所展宽。Canny 算子检测精度较高,具有平滑作用,去噪能力强,检测效果为最好。改进Sobel算子比经典Soble算子检测的边缘更加精细;抗噪能力较强,克服了Sobel算子对噪声极其敏感的缺点。具有提取的边缘精细、抗噪能力强等优点,是一种简单有效的边缘检测算法。
4 结束语
根据以上实验和算法分析可得,Roberts,Sobel和Prewitt 算子的算法较为简单,容易实现,运算速度较快,对噪声敏感,可用于车牌号码识别、流水线上产品检测、电视节目字幕检测等对识别速度要求较高而对精度要求不高的地方。Log算子的算法稍微复杂一些,其检测效果好于Roberts,Sobel 和Prewitt算子,可用于答卷识别、邮政分捡等对识别速度和精度都有一定要求的地方。改进的Sobel梯度边缘检测算法,虽然运行时间较原算法多一些,但是它克服了sobel算子进行边缘检测存在边缘粗糙、对噪声敏感的缺点,具有提取的边缘精细、抗噪能力强等优点,是一种简单有效的边缘检测算法。Canny算子算法最为复杂,但其检测效果为最好,可用于医学识别、遥测等对速度要求不高而对精度要求较高的地方。在应用中,应根据实际情况选择不同的微分算子。
参考文献:
[1] 张凯丽,刘辉.边缘检测技术的发展研究[J]. 昆明理工大学学报,2000,5( 25) .
[2] 郝文化,田蕾,董秀芳,等. MATLAB 图形图像处理应用教
程[M]. 中国水利水电出版社,2004.
[3] Rafael C. Gonzalez Richard E. Woods 著.阮秋琦 阮宇智 等译.Digital Image Processing [M].电子工业出版社,2003
[4] John Canny,Member,IEEE.A Computational Approach to EdgeDetection[J]. Pattern Analysis and Machine Intelligence,November 1986,PA-MI-8(1) : 679-697.
[5] Mitra Basu,Gaussian-based edge-detection methods-a survey[J].Systems,Man and Cybernetics,Part C,IEEE Transactions on Aug.2002,32( 3) : 252-260.
[6] 林卉,赵长胜,舒宁.基于Canny 算子的边缘检测及评价[J].黑
龙江工程学院学报,2003,2(17).附:
1、 matlab边缘检测程序
(rice图像):
I1=imread ('rice.tif' );
I=rgb2gray(I1);
a=edge(I,'roberts');
b=edge(I,'sobel');
c=edge(I,'prewitt');
d=edge(I,'log');
e=edge(I,'canny'); %canny用于细节较多的图像时,可以规定门限值去掉弱边缘
imwrite(a,'roberts.tif');
imwrite(b,'sobe1.tif');
imwrite(c,'prewitt.tif');
imwrite(d,'log.tif');
imwrite(e,'canny.tif' );
figure(5),imshow(a);
title('roberts');
figure(6),imshow(b);
title('sobel');
figure(7),imshow(c);
title('prewitt');
figure(8),imshow(d);
title('log');
figure(9),imshow(e);
title('canny');
(camera图像):
I1=imread ('camera.tif' );
I=rgb2gray(I1);
a=edge(I,'roberts');
b=edge(I,'sobel');
c=edge(I,'prewitt');
d=edge(I,'log');
e=edge(I,'canny',[0 0.18]); %带阈值范围,去掉0-0.18阈值范围边缘
imwrite(a,'roberts.tif');
imwrite(b,'sobe1.tif');
imwrite(c,'prewitt.tif');
imwrite(d,'log.tif');
imwrite(e,'canny.tif');
figure(5),imshow(a);
title('roberts');
figure(6),imshow(b);
title('sobel');
figure(7),imshow(c);
title('prewitt');
figure(8),imshow(d);
title('log');
figure(9),imshow(e);
title('canny');
改进Sobel程序(matlab):
clc
clear all %清除全局变量
close all %关闭所有窗口
A1=imread('camera.jpg'); %读入原图
figure(1),imshow(A1); %显示原图
title('原图:');
A2=rgb2gray(A1); %转为灰度图像
[m1 n1]=size(A2); %获取图像宽度和长度 %%%%%%中值滤波 5X5矩形窗口%%%%%
A3=A2;
a=A3;
for i=3:m1-2
for j=3:n1-2
A3=A2(i-2:i+2,j-2:j+2);
B=sort(A3(:));
a(i,j)=B(13);
end
end
A=histeq(a); %滤波后的直方图图像
figure(2),imshow(A);
title('滤波后的直方图:');
%四个方向模板
mask1=[2 3 0 -3 -2;3 4 0 -4 -3;6 6 0 -6 -6;3 4 0 -4 -3;2 3 0 -3 -2];
mask2=[2 3 6 3 2;3 4 6 4 3;0 0 0 0 0;-3 -4 -6 -4 -3;-2 -3 -6 -3 -2];
mask3=[0 -2 -3 -2 -6;2 0 -4 -6 -2;3 4 0 -4 -3;2 6 4 0 -2;6 2 3 2 0];
mask4=[-6 -2 -3 -2 0;-2 -6 -4 0 2;-3 -4 0 4 2;-2 0 4 6 2;0 2 3 2 6];
I=im2double(A1);
d1=imfilter(I,mask1);
d2=imfilter(I,mask2);
d3=imfilter(I,mask3);
d4=imfilter(I,mask4);
dd=max(abs(d1),abs(d2)); %取四种模板的最大灰度值组成图像dd
dd=max(dd,abs(d3));
dd=max(dd,abs(d4));
[m,n]=size(dd);
s=dd;
for i=2:m-1 %细化处理
for j=2:n-1
s(i,j)=dd(i,j);
q=max(s(i-1,j-1),s(i,j-1)); %将8领域的最大灰度值赋予q
q=max(q,s(i+1,j-1));
q=max(q,s(i-1,j));
q=max(q,s(i,j));
q=max(q,s(i+1,j));
q=max(q,s(i-1,j+1));
q=max(q,s(i,j+1));
q=max(q,s(i+1,j+1));
if s(i,j)>(0.8*q) %
s(i,j)=q;
else
s(i,j)=0;
end
end
end
grad=mat2gray(dd);
%level=graythresh(grad);
BW=im2bw(grad,0.17647);
%figure,imshow(dd);
figure(3),imshow(BW);
title('未经细化处理的改进sobel边缘检测:')
%figure,imshow(s);
%title('123')
grad=mat2gray(s);
%level=graythresh(grad);
BW1=im2bw(grad,0.3); %设定门限值为0.22
figure(4),imshow(BW1);
title('细化处理后改进Sobel算法边缘检测:')
¥29.8
¥9.9
¥59.8