图像边缘检测程序.docx
《图像边缘检测程序.docx》由会员分享,可在线阅读,更多相关《图像边缘检测程序.docx(30页珍藏版)》请在冰点文库上搜索。
图像边缘检测程序
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2012年秋季学期
图像处理综合训练
题目:
图像边缘检测程序设计
专业班级:
姓名:
学号:
指导教师:
成绩:
三、详细设计过程7
五、程序运行截图及其说明12
摘要
图像处理就是对图像信息加工以满足人的视觉心理或应用需求的方法。
图像处理方法有光学方法和电子学方法。
数字图像处理是利用数字计算机或其它的硬件设备对图像信息转换而得到的电信号进行某些数学处理以提高图像的实用性。
边缘检测是目前图像分析领域中的基础技术,也是数字图像处理中的一项重要内容。
它利用图像一阶倒数的极值或二阶倒数的过零点信息来提取边缘。
本文对图像边缘检测的几种经典算法包括一阶微分的Sobel算子、Robert算子、Priwitt算子,二阶微分laplacian算子及Canny算子。
通过实例图像对不同边缘检测算法的效果进行分析,比较了不同算法的特点和适用范围。
关键词:
图像处理;边缘检测;一阶微分;二阶微分
一、前言
在实际图像边缘检测问题中图像的边缘作为图像的一种基本特征经常被应用到较高层次的图像应用中去。
它在图像识别图像分割图像增强以及图像压缩等的领域中有较为广泛的应用也是它们的基础。
图像边缘是图像最基本的特征之一往往携带着一幅图像的大部分信息。
而边缘存在于图像的不规则结构和不平稳现象中也即存在于信号的突变点处这些点给出了图像轮廓的位置。
这些轮廓常常是我们在图像边缘检测时所需要的非常重要的一些特征条件这就需要我们对一幅图像检测并提取出它的边缘。
边缘是以图像的局部特征不连续的形式出现的,也就是指图像局部亮度变化最显著的部分,同时边缘也是不同区域的分界处。
边缘检测是图像特征提取的重要技术之一,边缘常常意味着一个区域的终结和另一个区域的开始。
图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构,它对于我们进行高层次的特征描述、识别和理解等有着重大的影响。
又由于边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,是图像识别中提取图像特征的一个重要属性。
图像理解和分析的第一步往往就是边缘检测。
在工程应用中占有十分重要的地位,所以人们一直在致力于研究和解决如何构造出具有良好性质及好的效果的边缘检测算子的问题。
本次的目的是从理论上对几种经典的边缘检测算法(Sobel算子、Robert算子、Priwitt算子、laplacian算子及Canny算子)进行分析,并用实现这些算法。
最后,通过实例图像对不同边缘检测算法的效果进行分析,找出各种算法的适用范围。
二、算法分析与描述
2.1基于一阶微分的边缘的检测
1、Sobel算子
Sobel算子和Prewitt算子都是一阶的微分算子,都是先对图像进行平滑处理,虽然两者都是加权平均滤波,但是前者邻域的像素对当前像素产生的影响不是等价的,距离不同的像素具有不同的权值,对算子结果产生的影响也不同。
这两种算子对噪声都有一定的抑制作用,但不能完全排除检测结果中出现虚假边缘的情况。
这两者对灰度渐变低噪声的图像有较好的检测效果,但是对于混合多复杂噪声的图像处理效果就不理想了。
正如前面所讲,采用
邻域可以避免在像素之间内插点上计算梯度.考虑一下上图中所示的点
周围点的排列.Sobel算子也是一种梯度幅值,
(1.1)
其中的偏导数用下式计算:
(1.2)
其中常数
和其他的梯度算子一样,
和
可用卷积模板来实现,如图1.1所示:
图1.1
请注意这一算子把重点放在接近于模板中心的像素点.Sobel算子是边缘检测器中最常用的算子之一.
(图1.2)
图1.2用于说明Sobel算子和Prewitt算子的邻域像素点标记
Prewitt算子与Sobel算子的方程完全一样,只是常量c=1.所以
(1.3)
请注意,与Sobel算子不同,这一算子没有把重点放在接近模板中心的像素点如图1.3所示
2、Robert算子
Robert算子边缘检测算子也叫交叉差分算子,是一种利用局部差分寻找边缘的算子,用
领域的处理。
边缘,是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。
图像的边缘对应着图像灰度的不连续性。
显然图像的边缘很少是从一个灰度跳到另一个灰度这样的理想状况。
真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。
边缘的锐利程度由图像灰度的梯度决定。
梯度是一个向量,∇f指出灰度变化最快的方向和变化量。
(1.5)
(1.6)
(1.7)
梯度大小由确定。
而梯度方向则由确定,因此最简单的边缘检测算子是用图像的垂直和水平差分来逼近梯度算子:
(1.8)
因此当我们寻找边缘的时候,最简单的方法是对每一个像素计算出(1.8)的向量,然后求出它的绝对值。
利用这种思想就得到了Roberts算子:
(1.9)
其中f(x,y)是具有整数像素坐标的输入图像。
其中g(x,y)由下面的模板计算:
(1.3)
同前面的
梯度算子一样,差分值将在内插点[x+1/2;y+1/2]处计算.Roberts算子是该点连续梯度的近似值,而不是所预期的点[x,y]处的近似值。
3、laplacian算子
平滑过的阶跃边缘二阶导数是一个在边缘点处过零的函数。
拉普拉斯算子是二阶导数边缘算子。
函数
的拉普拉斯算子公式为
(1.7)
使用差分方程对
和
方向上的二阶偏导数近似如下:
5(1.8)
这一近似式是以点[x,y+1]为中心的。
用y-1替换y,得到
(1.9)
它是以点
为中心的二阶偏导数的理想近似式,类似地,
(1.10)
把这两个式子合并为一个算子,就成为下面能用来近似拉普拉斯算子的模板:
(1.11)
当拉普拉斯算子输出出现过零点时就表明有边缘存在,其中忽略无意义的过零点(均匀零区)。
原则上,过零点的位置精度可以通过线性内插方法精确到子像素分辨率,不过由于噪声,结果可能不会很精确。
4.Canny算子
检测阶跃边缘的基本思想是在图像中找出具有局部最大梯度幅值的像素点。
检测阶跃边缘的大部分工作集中在寻找。
Canny边缘检测器是高斯函数的一阶导数,是对信噪比与定位之乘积的最优化逼近算子[Canny1986]。
我们将通过下面的符号对Canny边缘检测器算法作一概括说明。
用
表示图像,使用可分离滤波方法求图像与高斯平滑滤波器卷积,得到的结果是一个已平滑数据阵列
,
其中
是高斯函数的散布参数,它控制着平滑程度。
已平滑数据阵列
的梯度可以使用
一阶有限差分近似来计算
与
偏导数的两个阵列
与
:
(1.12)
在这个
正方形内求有限差分的均值,以便在图像中的同一点计算x和y的偏导数梯度。
幅值和方位角可用直角坐标到极坐标的坐标转化公式来计算:
(1.13)
(1.14)
其中,反正切函数包含了两个参量,它表示一个角度,其取值范围是整个圆周范围内。
为高效率地计算这些函数,尽量不用浮点运算.梯度的幅度和方向也可以通过查找表由偏导数计算。
3、详细设计过程
1、分析
图像的大部分主要信息都存在于图像的边缘中,主要表现为图像局部特征的不连续性,是图像中灰度变化比较剧烈的地方,即通常所说的信号发生奇异变化的地方。
奇异信号沿边缘走向的灰度变化剧烈,通常将边缘划分为阶跃状和屋顶状两种类型如图3.1所示。
阶跃边缘中两边的灰度值有明显的变化;而屋顶状边缘位于灰度增加与减少的交界处。
在数学上可利用灰度的导数来刻画边缘点的变化,对阶跃边缘、屋顶状边缘分别求其一阶、二阶导数。
图3.1阶跃边缘和屋顶状边缘处一阶和二阶导数变化规律
(其中第一排为理想信号,第二排对应实际信号)
2、工作流程分析
系统工作流程较为简单,功能用于对图像进行边缘检测,工作流程并不复杂。
双击ch1_1.exe文件,系统界面就出现了,点击文件,然后选择打开,打开BMP格式的图片文件,此时图片就会显示在工作区域;主要模块的系统过程如图3.2所示
图3.2
4、一阶微分算法的实验结果与分析
(1)Sobel算子公式的定义为:
(2)实验结果分析
以cameraman图片为例,用Sobel算法,分别给检测结果。
理论上Sobel算子可以轻易在空间上实现,Sobel边缘检测器不但可以产生较好的边缘检测效果由5.2图可以看出Sobel算子虽然检测到的边缘信息很丰富,也较为连续,但是边缘很模糊,严重的影响了视觉效果。
(4)Robert算子的公式定义为:
(5)Prewitt算子:
Prewitt算子与Soble算子不同的地方在于没有把重点放在接近模板中心的像素点。
Prewitt算子首先进行邻域平均或加权平均,然后进行微分。
(6)实验结果分析
以cameraman图片为例,分别用Roberts、Prewitt两种算法,分别给检测结果。
通过图5.3和图5.4知,Roberts算子、Prewitt算子,都能够比较准确的检测出图像的边缘。
基于一阶微分的边缘检测算子具有实现简单、运算速度快等特点,检测结果不可靠,不能准确判定边缘的存在及边缘的准确位置,造成这种情况的原因:
(1)实际边缘灰度与理想边缘灰度值间存在差异,这类算子可能检测出多个边缘;
(2)边缘存在的尺度范围各不相同,这类算子固定的大小不利于检测出不同尺度上的所有边缘;(3)对噪声都比较敏感。
5、二阶微分算法的实验结果与分析
(1)Laplacian算子的公式为:
(2)Canny算子的公式为:
(3)实验结果分析
以cameraman图片为例,分别用Laplacian、Canny两种算法,分别给检测结果。
由图5.5可以看出Laplacian算子:
对图像中的阶跃性边缘点定位准确。
Canny:
采用高斯函数对图像进行平滑处理,该算子也将一些高频边缘平滑掉,造成边缘丢失,采用了双阈值算法检测和连接边缘,边缘的连续性较好。
Laplacian算子是对二维函数进行运算的二阶导数算子,与方向无关,对取向不敏感,因而计算量要小。
根据边缘的特性,Laplacian算子可以作为边缘提取算子,计算数字图像的Laplacian值可以借助模板实现,它相当于高通滤波,常会出现一些虚假边缘。
Canny算子是一个具有滤波、增强和检测的多阶段的优化算子。
在进行处理前,Canny算子增强边缘是将邻域(或局部)强度值有显著变化的点突出来,一般通过计算梯度幅值来完成。
Canny分割算法采用一阶偏导的有限差分来计算梯度的幅值和方向。
对一个边缘来说,其一阶导数在边界处存在一个向上的阶跃,或者其二阶导数过零点。
在处理过程中,Canny算法还将经过一个非极大值抑制的过程。
最后Canny算法将采用两个阈值来连接边缘。
但也有不足之处,Canny算法对整幅图像采用同一高斯函数进行滤波,无法顾及图像局部特征信息,边缘检测的阈值需要预先设定。
先确定一个阈值系数,该系数定义为梯度小于阈值的像素数所占边缘像素总数的比例,以此来确定阈值。
这种方法没有利用图像自身的信息,不具有自适应能力。
四、调试过程中出现的问题及相应解决办法
Matlab语言是一种解释执行的语言,它灵活、方便,其调试程序手段丰富,调试速度快。
。
Matlab语言与其它语言相比,把编辑、编译、连接和执行融为一体。
它能在同一画面上进行灵活操作快速排除输入程序中的书写错误、语法错误以至语意错误,从而加快了用户编写、修改和调试程序的速度,可以说在编程和调试过程中它是一种非常简单的语言。
但之前并没有熟悉Matlab的编译,出现直接把程序复制粘贴的错误,后来才学习正确的编译运行过程。
代码在运行过程中的错误:
[,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','ImageFiles(*.bmp,*.jpg,*.png,*.jpeg)';...
'*.*','AllFiles(*.*)'},...
'Pickanimage');
axes(handles.axes_src);
fpath=[pathname];
此代码缺少了imread读入图片,因此不能够正确的运行。
应在代码后面加入如下代码:
img_src=imread(fpath);
五、程序运行截图及其说明
1、图5.1:
是原图,做为参考图片
图5.
2、图5.2:
是Sobel算子运行出来后的图片,能检测到的边缘信息较为连续,但边缘很模糊。
图5.2
3、图5.3:
是Roberts算子运行出来后所得的图片,但边缘较细。
图5.3
4、图5.4:
是Prewitt算子运行后的图片,所得的图片精度不高,边缘较粗。
图5.4
5、图5.5:
是Laplacian算子所得,对图像中的阶跃性边缘点定位准确,有信息丢失,边缘不够连续。
图5.5
6、图5.6:
是Canny算子所得,边缘较联系,但还是有丢失边缘信息。
图5.6
六、简单操作手
1、Matlab运行环境简介
1)启动Matlab可由下列方法之一进入Matlab命令行窗口:
(1)开始→程序→Matlab。
(2)双击桌面Matlab图标。
2)编制、运行Matlab程序可用下列方法之一编制和运行Matlab程序
选择菜单条中的“File→Open(或New)进入Matlab程序编辑器,在编辑器中编辑程序。
A.命令行以“,”或“;”结尾。
以“,”结尾运行时显示该命令运行结果,以“;”结尾不显示该命令运行结果。
B.注释前加“%”。
C.运行操作可使用命令快捷键。
2、图像文件的读、写和显示
图像文件的读取读图像文件的函数格式:
A=imread(‘路径、文件名及文件后缀’),如
I=imread(‘e:
\image.bmp’)
其含义:
将e盘中的bmp文件image赋给变量I,bmp(windowsbitmap)为位图文件。
3、得到的窗口如图6.1,文件菜单里包括:
打开,保存,退出按钮;图像处理菜单里包括:
Sobel算子、Robert算子、Priwitt算子、laplacian算子、Canny算子功能相应的按钮,分别为Sobel、Robert、Priwitt、laplacian、Canny。
图6.1
4、打开图片信息:
点击文件菜单里的打开选择所要打开文件夹里的图片,则有如图6.2所示。
图6.2
5、图像边缘检测:
点击图像处理菜单,选择里面的算子所对应的按钮进行操作,然后选择文件菜单里的保存按钮保存图片,保存到相应的文件夹,则得到的图如图6.3所示。
图6.3
6、退出:
若要退出,点击文件菜单里的退出按钮,则可退出图像处理界面。
设计总结
通过分析几种应用于数字图像处理中的边缘检测算子,根据它们在实践中的应用结果进行研究,主要包括:
Sobel边缘算子、Robert边缘算子、Prewitt边缘算子、laplacian算子、Canny边缘算子对图像的边缘检测。
Sobel算子:
根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。
提供较为精确的边缘方向信息,边缘定位精度不够高。
当对精度要求不是很高时,是一种较为常用的边缘检测方法。
Robert算子:
采用对角线方向相邻两像素之差表示信号的突变,检测水平和垂直方向边缘的性能好于斜线方向,定位精度比较高,检测出的边缘较细。
Prewitt算子:
凡灰度新值大于或等于阈值的像素点都是边缘点。
即选择适当的阈值T,若P(i,j)≥T,则(i,j)为边缘点,P(i,j)为边缘图像。
这种判定是欠合理的,会造成边缘点的误判。
检测出的边缘比较粗,定位精度低,容易损失角点。
Laplacian算子:
是二阶微分算子,对图像中的阶跃性边缘点定位准确,但会丢失一部分边缘的方向信息,造成一些不连续的检测边缘。
Canny算子:
采用高斯函数对图像进行平滑处理,该算子也将一些高频边缘平滑掉,造成边缘丢失,采用了双阈值算法检测和连接边缘,边缘的连续性较好。
通过这次数字图像课程设计,让我可以熟悉Matlab这个软件。
Matlab在工业方面的应用很广泛,我希望能有机会更深刻的学习理解它。
在指导教师的指导下,我顺利的完成了这次数字图像的课程设计,课设题目有点难度,但对我们的课程学习,和知识的运用有着很好的作用。
总之,我认为这次课程设计是不错的,收获也是丰富的。
参考资料
[1]朱虹.数字图像处理基础[M].北京:
科学出版社.2005.4:
217-220
[2]余成波.数字图像处理及MATLAB实现[M].重庆:
重庆大学出版社.2003.7:
356-359
[3]深洁,杜宇人,高浩军.图像边缘检测技术研究[J].信息技术,2005(12).
[4]尹建媛.图像处理中边缘检测算法的研究[J].科技信息.2008,(4):
30-32
[5]崔屹.数字图像处理技术与应用[M].北京:
电子工业出版社,1997:
35-39.
[6]王予生,卜佳俊,陈纯.一种基于积分变换的边缘检测算法[J].中国图象图形学报.2002,7
(2):
145—149
致谢
通过两周的的努力,我的课程设计终于完成了。
在整个课程设计中,我在学习上和思想上都受益非浅,这除了自身的努力外,与指导的老师、同学和朋友的关心、支持和鼓励是分不开的。
在课程设计的编写过程中,指导老师倾注了大量的心血,一遍又一遍地指出每次编程里的具体问题,详细讲解课题,你的细心指导,严格把关,循循善诱,在此我表示衷心感谢。
同时我还要感谢在我做课设期间给予我帮助的同学们,没有你们的帮助,我的课设不会那么顺利。
做课程设计是一次再系统的学习,让我们巩固了我们所学的知识,让我们以后能更好的运用于实践打下了一定基础。
同时课程设计的的完成,让我在其中学到了许多,尤其是学会了帮助合作,懂得了帮助合作造就的效益和成果。
在这里再次感谢帮助我的的同学,还有对我们精心指导的老师!
附录
源程序:
functionvarargout=Mywork(varargin)
%MYWORKMATLABcodeforMywork.fig
%MYWORK,byitself,createsanewMYWORKorraisestheexisting
%singleton*.
%
%H=MYWORKreturnsthehandletoanewMYWORKorthehandleto
%theexistingsingleton*.
%
%MYWORK('CALLBACK',hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinMYWORK.Mwiththegiveninputarguments.
%
%MYWORK('Property','Value',...)createsanewMYWORKorraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforeMywork_OpeningFcngetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.AllinputsarepassedtoMywork_OpeningFcnviavarargin.
%
%*SeeGUIOptionsonGUIDE'sToolsmenu.Choose"GUIallowsonlyone
%instancetorun(singleton)".
%
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%EdittheabovetexttomodifytheresponsetohelpMywork
%LastModifiedbyGUIDEv2.508-Jan-201320:
09:
06
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('gui_Name',m,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@Mywork_OpeningFcn,...
'gui_OutputFcn',@Mywork_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
%Endinitializationcode-DONOTEDIT
%---ExecutesjustbeforeMyworkismadevisible.
functionMywork_OpeningFcn(hObject,eventdata,handles,varargin)
setappdata(handles.figure_Mywork,'img_src',0);
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstoMywork(seeVARARGIN)
%ChoosedefaultcommandlineoutputforMywork
handles.output=hObject;
%Updatehandlesstructu