✅ 操作成功!

边缘检测

发布时间:2023-06-13 作者:admin 来源:文学

边缘检测

边缘检测

赖蛤蟆-陕西楞娃

2023年3月19日发(作者:业物)

1/11

几种常用边缘检测算法的比较

摘要:边缘是图像最基本的特征,边缘检测是图像分析与识别的重要环节。基于微分算子的

边缘检测是目前较为常用的边缘检测方法。通过对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/11

要折衷。在边缘检测算法中,前三个步骤用得十分普遍,这是因为在大多数情况下,只需要

边缘检测器指出边缘出现在图像中某一像素点的附近即可,而没有必要指出边缘的精确位

置。

2微分边缘检测算子

2.1一阶微分算子

2.1.1Roberts算子

Roberts算子是一种利用局部差分算子寻找边缘的算子,它由下式给出:

22])1,(),1([])1,1(),([),(yxfyxfyxfyxfyxg(1)

其中,),(yxf、),1(yxf、)1,(yxf和)1,1(yxf分别为4领域的坐标,且是具

有整数像素坐标的输入图像。

Robert算子是22算子模板。图2所示的2个卷积核形成了Roberts算子。图像中的每一

个点都用这2个核做卷积。

10

0-1

图2Roberts算子

Roberts算子边缘定位精度较高,但容易丢失一部分边缘,同时由于没有经过图像平滑计算,

因此不能抑制噪声,该算子对具有陡峭的低噪声图像响应较好。

2.1.2Sobel算子

Sobel算子是一种一阶微分算子,它利用像素临近区域的梯度值来计算1个像素的梯度,然

后根据一定的阈值来取舍。它由下式给出:

22

yx

ddS(2)

Sobel算子是33算子模板。图3所示的2个卷积核dx、dy形成Sobel算子。一个核通常

的垂直边缘响应最大,而另一个核对水平边缘响应最大。2个卷积的最大值作为该点的输出

值。运算结果是一幅边缘幅度图像。

-101

-202

-101

图3Sobel算子

2.1.3Prewitt算子

Prewitt算子由下式给出:

22

yxp

ddS(3)

Prewitt算子是33算子模板。图4所示的2个卷积核dx和dy形成了Prewitt算子。与Sobel

算子的方法一样,图像中的每个点都用这2个核进行卷积。取最大值作为输出值。Prewitt

算子也产生一副边缘幅度图像。

01

-10

121

000

-1-2-1

3/11

-101

-101

-101

图4Prewitt算子

2.1.4Canny算子

传统的Canny算法是通过在22邻域内求有限差分来计算梯度幅值。Canny算子法实现的

方式为:图像先用2D高斯滤波模板进行卷积以消除噪声,再对滤波后图像中的每个像素计

算其梯度的大小和方向。计算可采用以下22大小的模板作为对

x

方向和y方向偏微分的

一阶近似:

11

11

2

1

x

G



11

11

2

1

y

G

由此得到梯度的大小M和方向:

22

yx

GGM

x

y

G

G

Arctan

通过梯度的方向,可以找到这个像素梯度方向的邻接像素:

321

0x0

123

最后通过非最大值抑制以及阈值化和边缘连接。Canny算子有信噪比准则、定位精度准则和

单边缘响应准则。Canny算法的实质是用一个准高斯函数做平滑运算,然后以带方向的一阶

微分算子定位导数最大值,它可用高斯函数的梯度来近似,在理论上很接近k个指数函数

的线性组合形成的最佳边缘算子。它是一阶传统微分中检测阶跃性边缘效果最好的算子之

一,它比Prewitt算子、Sobel算子的去噪能力都要强,但它也容易平滑掉一些边缘信息,

其检查方法较为复杂。

2.1.5一种改进的Sobel算子

基于Sobel算子,。为了能够更准确地描述出图像边缘点,减少噪声对检测结果的影响,提

高算子的抗噪能力,重新构造了4个5×5大小的模板,模板中各个位置的权重是由该位置

到中心点的距离以及该位置在模板中所在的方位决定的,等距离的点,具有相同的权重。最

后选择有最高输出模板所对应边缘梯度值来作为像元的边缘梯度强度。改进Sobel算子如图

5所示:

230-3-2

111

000

-1-1-1

4/11

340-4-3

660-6-6

340-4-3

230-3-2

(1)、x水平方向(2)、y垂直方向

0-2-3-2-6

20-4-6-2

340-4-3

2640-2

62320

(3)、45方向(4)、135方向

图5方向模板

由一阶梯度算子得到图像的梯度图像。一般来说,其边缘较粗。若直接对梯度图像设定阈值

进行二值化,很难找到合适的阈值,使得检测出来的边缘达到要求,这不便于边缘连接与边

缘特征提取等后期处理。因此在对图像梯度图像进行二值化前,有必要对所检测出来的梯度

边缘进行细化处理。细化处理可以通过找出像素点(m,n)某个邻域中的最大值Max(m,n),

根据Max(m,n)来局部设定阈值。按照该点梯度值与阈值的关系对该点进行取舍,这样就能

达到将梯度图细化的目的。计算式如下:

(,)(,)edgemnMaxmn(,)(,)grademnaMaxij

(,)0edgemnothers

式中:grade(m,n)为像素点(m,n)对应的梯度值;Max(m,m)为(m,n)点8邻域最大梯度

值;a为控制因子,0

2.2二阶微分算子

2.2.1Laplacian算子

拉普拉斯二阶零交叉(zerocross)算子是利用边缘点处二阶导函数出现零交叉原理来检测边

缘。函数),(yxf的拉普拉斯算子公式为:

2

2

2

2

2

y

f

x

f

f



使用差分方程对x和y方向上的二阶偏导数近似如下:

23632

34643

00000

-3-4-6-4-3

-2-3-6-3-2

-6-2-3-20

-2-6-402

-3-4042

-20462

02326

5/11



x

jifiif

x

G

x

f

x

]),[]1,[(

2

2



x

jif

x

jif],[]1,[

],[])1,[2]2,[(jifjifjif

这一近似式是以点[i,j+1]为中心的。用j-1替换j,得到以点[i,j]为中心的二阶偏导数的理想近

似式:

]1,[]),[2]1,[(

2

2



jifjifjif

x

f

(1)

类似地,可得:

],1[]),[2],1[(

2

2

jifjifjif

y

f



(2)

把(1)、(2)式合并可得能用来近似表达拉普拉斯算子的模板:



010

141

010

2

当拉普拉斯算子输出出现过零点时就表明有边缘存在,其中忽略无意义的过零点(均匀零

区)。原则上,过零点的位置精度可以通过线性内插方法精确到子像素的分辨率,不过由于

噪声,结果可能不会很精确。拉普拉斯算子不具方向性,对灰度突变敏感,定位精度较高,

同时,对噪声也敏感。Laplacian算子一般不以其原始形式用于边缘检测。

2.2.2LOG算子

正如上面所提到的,利用图像强度二阶导数的零交叉点来求边缘点的算法对噪声十分敏感,

所以,希望在边缘增强前滤除噪声。将高斯滤波器和拉普拉斯零交叉算子结合在一起就形成

了Log算子。Log算子实现的方式有两种:一种是图像先与高斯滤波器进行卷积,再求卷

积的拉普拉斯变换;另一种是先求高斯滤波器的拉普拉斯变换,再求与图像的卷积。Log边

缘检测器的基本特征是:①平滑滤波器是高斯滤波器;②增强步骤采用二阶导数(二维拉普拉

斯函数);③边缘检测判据是二阶导数零交叉点并对应一阶导数的较大峰值;④使用线性内

插方法在子像素分辨率水平上估计边缘的位置。Log算子的输出可通过卷积运算得到:

)],(*),([),(2yxfyxgyxh

根据卷积求导法有:

),(*)],([),(2yxfyxgyxh

其中,2

22

2

4

222

2)

2

(),(

yx

e

yx

yxg





Log算子法既平滑了图像又降低了噪声,由于平滑会导致边缘的延展,因此边缘检测器只

考虑那些具有局部梯度最大值的点为边缘点,这一点可以用二阶导数的零交叉点来实现。为

了避免检测出非显著边缘,选择一阶导数大于某一阈值的零交叉点作为边缘点。

6/11

3MATLAB仿真

MATLAB图像处理工具中有多种边缘检测算子函数,利用MATLABedge函数,得以

下实验结果:

针对图片细节少的rice图片,结果如下:

7/11

针对细节较多的camera图,程序运行结果如下:

8/11

各算子的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]著.阮秋琦阮宇智等译.DigitalImageProcessing

[M].电子工业出版社,2003

[4]JohnCanny,Member,IEEE.AComputationalApproachtoEdgeDetection[J].PatternAnalysis

andMachineIntelligence,November1986,PA-MI-8(1):679-697.

[5]MitraBasu,Gaussian-basededge-detectionmethods-asurvey[J].Systems,Manand

Cybernetics,PartC,IEEETransactionsonAug.2002,32(3):252-260.

[6]林卉,赵长胜,舒宁.基于Canny算子的边缘检测及评价[J].黑

龙江工程学院学报,2003,2(17).

9/11

附:

matlab边缘检测程序

(rice图像):

I1=imread('');

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,'');

imwrite(b,'');

imwrite(c,'');

imwrite(d,'');

imwrite(e,'');

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('');

I=rgb2gray(I1);

a=edge(I,'roberts');

b=edge(I,'sobel');

c=edge(I,'prewitt');

d=edge(I,'log');

e=edge(I,'canny',[00.18]);%带阈值范围,去掉0-0.18阈值范围边缘

imwrite(a,'');

imwrite(b,'');

imwrite(c,'');

imwrite(d,'');

imwrite(e,'');

figure(5),imshow(a);

title('roberts');

figure(6),imshow(b);

title('sobel');

figure(7),imshow(c);

title('prewitt');

10/11

figure(8),imshow(d);

title('log');

figure(9),imshow(e);

title('canny');

改进Sobel程序(matlab):

clc

clearall%清除全局变量

closeall%关闭所有窗口

A1=imread('');%读入原图

figure(1),imshow(A1);%显示原图

title('原图:');

A2=rgb2gray(A1);%转为灰度图像

[m1n1]=size(A2);%获取图像宽度和长度%%%%%%中值

滤波5X5矩形窗口%%%%%

A3=A2;

a=A3;

fori=3:m1-2

forj=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=[230-3-2;340-4-3;660-6-6;340-4-3;230-3-2];

mask2=[23632;34643;00000;-3-4-6-4-3;-2-3-6-3-2];

mask3=[0-2-3-2-6;20-4-6-2;340-4-3;2640-2;62320];

mask4=[-6-2-3-20;-2-6-402;-3-4042;-20462;02326];

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;

fori=2:m-1%细化处理

forj=2:n-1

11/11

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));

ifs(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算法边缘检测:')

👁️ 阅读量:0