图像边缘检测课程设计资料.docx
《图像边缘检测课程设计资料.docx》由会员分享,可在线阅读,更多相关《图像边缘检测课程设计资料.docx(23页珍藏版)》请在冰豆网上搜索。
![图像边缘检测课程设计资料.docx](https://file1.bdocx.com/fileroot1/2023-2/8/a38f546c-8d36-4972-8dca-b21bfc731ea4/a38f546c-8d36-4972-8dca-b21bfc731ea41.gif)
图像边缘检测课程设计资料
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2012年秋季学期
图像处理综合训练
题目:
图像边缘检测课程设计
专业班级:
姓名:
学号:
指导教师:
成绩:
摘要
在实际图像处理问题中,图像的边缘作为图像的一种基本特征,经常被应用到较高层次的图像应用中去。
它在图像识别,图像分割,图像增强以及图像压缩等的领域中有较为广泛的应用,也是它们的基础。
边缘检测是图像处理与分析中最基础的内容之一,也是至今仍没有得到圆满解决的一类问题。
图像的边缘包含了图像的位置、轮廓等特征,是图像的基本特征之一,广泛地应用于特征描述、图像分割、图像增强、图像复原、模式识别、图像压缩等图像分析和处理中。
因此,图像边缘和轮廓特征的检测与提取方法,一直是图像处理与分析技术中的研究热点,新理论、新方法不断涌现。
本文研究了一些边缘检测算法,包括传统的Roberts、Sobel、Prewitt、Canny等算法。
经典边缘检测方法的抗噪声性能都较差,解决该问题的主要方法就是设置阈值,把得到的图像高频部分与阈值相比较以达到去噪的目的,所以阈值的选取显得尤为重要。
传统方法中的阈值都是通过实验确定的,没有统一的阈值选取方法。
本文利用边缘的最大后验概率估计,介绍一种新的边缘估计方法,从理论上说明了怎样选取最佳阈值。
文章中关于这些方法都有较详细的介绍,以及算法的实现步骤,对算法均进行了仿真实验。
关键词:
边缘检测;图像处理;Matlab;Sobel;检测算法
1、前言
随着信息技术的不断发展和用户需求的不断增长,嵌入式系统逐渐走进国民生产的方方面面,其应用也日益广泛。
目前国内一个普遍被认同的定义是:
以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
嵌入式系统的应用领域也非常广泛。
嵌入式系统几乎包括了生活中的所有电器设备,如掌上PDA、移动计算设备、手机上网、数字电视、多媒体、汽车、数字相机、电梯、空调、安全系统、自动售货机、工业自动化仪表与医疗仪器等。
而图像边缘检测则是图像处理中非常基础但是及其重要步骤。
边缘是两个不同区域之间的边界。
图像边缘检测是图像处理,图像分析,模式识别等一系列图像处理过程中最重要的步骤。
目前,学界上已经有许多种不同点的方法来实现边缘检测的功能,比如说差分法(Kirsch,1971)和曲线拟合法(Haralick,1984)。
传统的边缘检测方法,比如Sobel、Prewitt、Kirsch算法,通过计算第一阶方向导数来决定边缘的位置。
零点交叉边缘检测法(Bovik,1998)运用了二阶导数和拉普拉斯算符。
而Canny算法(Canny,1986)是目前学界最流行并且应用最广泛的的高斯边缘检测算法。
尽管高斯检测算法(Yuksel,2007)相对来说有更好的性能表现,但是所需要的计算也比传统基于求导的检测算法复杂的多。
近些年来,对于图像处理在许多不同的科学和工程领域应用的研究越来越火热。
在嵌入式系统上实现图像处理能够很好的解决在一般PC或者工控机上实现图像处理的不足之处,比如说便携性差,功耗大,移动性,灵活性不强等。
同时加之以集成度高,与网络的耦合也越来越紧密等特点。
嵌入式系统将是未来工业控制和其他一些行业的主要发展方向。
本文主要阐述了图像边缘检测算法的一些理论,并对检测的效果加以比较,同时介绍了嵌入式系统开发的流程,为图像类嵌入式开发系统开发提出可行的方案。
最后设计实现了边缘检测系统。
二、算法分析与描述
2.1Roberts算子
由Roberts提出的算子是一种利用局部差分算子寻找边缘的算子,对于边界陡峭且噪比较小的图像检测效果比较好,它在2×2邻域上计算对角导数,
G[i,j]又称为Roberts交叉算子。
在实际应用中,为简化运算,用梯度函数的Roberts绝对值来近似:
用卷积模板,上式变成:
其中Gx和Gy由下面图1所示的模板计算:
图1Robert边缘检测算子的模板
Roberts算子是该点连续梯度的近似值,而不是所预期的点处的近似值。
由上面两个卷积算子对图像运算后,代入2式,可求得图像的梯度幅度值G[i,j],然后选取适当的门限TH,作如下判断:
G[i,j]>TH,[i,j]为阶跃状边缘点,{G[i,j]}为一个二值图像,也就是图像的边缘。
由于利用局部差分检测比较陡峭的边缘,但对于噪声比较敏感,经常会出现孤立点,于是人们又提出了Prewitt算子[4]。
通过分析可知,Sobel算子法对高频成分丰富的图像处理效果好,对中低频成分的图像效果差。
2.2Prewitt算子
为在检测边缘的同时减少噪声的影响,Prewitt算子从加大边缘检测算子出发。
由2×2扩大到3×3来计算差分算子,所以其卷积模板为图2所示:
图2Prewitt边缘检测算子的模板
在图像中的每个像素位置都用这2个模板做卷积,Prewitt算子将方向差分运算与局部平均结合起来,表达式如下:
根据两式可以计算Prewitt梯度,选取适当的阈值T,对梯度图像二值化,得到一幅边缘二值图像。
采用Prewitt算子不仅能检测边缘点,而且还能抵制噪声的影响[5]。
通过分析可知,Prewitt算子法对高频成分丰富的图像处理效果好,对中低频成分的图像效果差。
2.3Sobel算子
传统的Sobel图像边缘检测方法,是在图像空间利用两个方向模板与图像进行邻域卷积来完成的。
这两个方向模板一个检测垂直边缘,一个检测水平边缘,如图3所示。
图中,模板内的数字为模板系数,梯度方向与边缘方向总是正交
水平边缘Sobel算子垂直边缘Sobel算子
图3Sobel算子
模板元素和窗口像素之间的对应关系(以3×3窗口为例)定义如下:
设窗口灰度为:
模板卷积计算就是下式求乘积和的过程:
式中,i=1,2分别代表垂直和水平模板。
为模板卷积法边缘检测的输出,
L为窗口宽度,对3×3窗口,l=1。
将两个卷积结果的最大值,赋给图像中对应模板中心位置的像素,作为该像素的新灰度值,即:
通过分析可知,Sobel算子法对高频成分丰富的图像处理效果好,对中低频成分的图像效果差。
2.4Laplacian算子
拉普拉斯算子是二阶导数的二维等效式。
函数f(x,y)的拉普拉斯算子公式为:
使用差分方程对x和y方向上的二阶偏导数近似如下:
这一近似式是以点f[i,j+1]为中心的,用j-1替换j得到
它是以点[i,j]为中心的二阶偏导数的理想近似式,类似地,
把式(2-3)和式(2-4)合并为一个算子,就成为式(2-5)能用来近似拉普拉斯算子的模板:
有时候希望邻域中心点具有更大的权值,比如下面式(2-6)的模板就是一种基于这种思想的近似拉普拉斯算子:
当拉普拉斯算子输出出现过零点时就表明有边缘存在,其中忽略无意义的过零点(均匀零区)。
原则上,过零点的位置精度可以通过线性内插方法精确到子像素分辨率。
通过分析可知,它不过由于噪声,以及由噪声引起的边缘两端的不对称性,结果可能不会很精确。
2.5Canny算子
Canny检测阶跃边缘的基本思想是在图像中找出具有局部最大梯度幅值的像素点。
检测阶跃边缘的大部分工作集中在寻找能够用于实际图像的梯度数字逼近。
由于实际的图像经过了摄像机光学系统和电路系统(带宽限制)固有的低通滤波器的平滑,因此,图像中的阶跃边缘不是十分陡立。
图像也受到摄像机噪声和场景中不希望的细节的干扰。
图像梯度逼近必须满足两个要求:
首先逼近必须能够抑制噪声效应;其次必须尽量精确地确定边缘的位置。
抑制噪声和边缘精确定位是无法同时得到满足的,也就是说,边缘检测算法通过图像平滑算子去除了噪声,但却增加了边缘定位的不确定性;反过来,若提高边缘检测算子对边缘的敏感性,同时也提高了对噪声的敏感性。
有一种线性算子可以在抗噪声干扰和精确定位之间提供最佳折衷方案,它就是高斯函数的一阶导数。
通过分析可知,采用高斯函数对图像进行平滑处理,因此具有较强的噪声抑制能力;同样该算子也将一些高频边缘平滑掉,造成边缘丢失,采用了双阈值算法检测和连接边缘,边缘的连续性较好。
3、详细设计过程
Roberts算子、Sobel算子、Prewitt算子的检测效果相差不大,三种算子的检测效果较之Canny和Log算子还是存在一定的差距。
这三种检测算子的阈值选择范围与log和canny算子相比要小些。
边缘点不够锐利和明确,线边缘检测要好于点边缘检测。
总体而言由于Prewitt算子受噪声影响较小,故检测效果要略好于另外两种。
由于Roberts算子是利用图像的两个对角线的相邻像素之差进行梯度幅值的检测,所以求得的是在差分点处梯度幅值的近似值,并且检测水平和垂直方向边缘的性能好于斜线方向的边缘,检测精度比较高,但容易丢失一部分边缘,同时由于没经过图像平滑计算,因此不能抑制噪声,但该算子对具有陡峭的低噪声图像响应最好。
Prewitt算子和Sobel算子都是对图像进行差分和滤波运算,仅在平滑部分的权值选择上有些差异,因此两者均对噪声具有一定的抑制能力,但这种抗噪能力是通过像素平均来实现的,所以图像产生了一定的模糊,而且还会检测出一些伪边缘,所以检测精度比较低,该算子比较适合用于图像边缘灰度值比较尖锐且图像噪声比较小的情况。
Canny算子采用高斯函数对图像进行平滑处理具有较强的去噪能力,容易平滑掉一些边缘信息,边缘定位精度较高。
该算子与其它边缘检测算子的不同之处在于,它使用2种不同的阈值分别检测强边缘和弱边缘,并且仅当弱边缘相连时才将弱边缘包含在输出图像中,因此这种方法较其它方法而言不容易被噪声“填充”更容易检测出真正的弱边缘。
通过对lena图的仿真实验结果可以看出,该算子在上述几种边缘检测算子当中效果最好。
边缘定位准确,连续性较好,虚假边缘少且边缘均具有单像素宽度。
LoG算子首先通过高斯函数对图像进行平滑处理,因此对噪声的抑制作用比较明显,但同时也可能将原有的边缘也平滑了,造成某些边缘无法检测到,比外高斯分布因子
的选择对图像边缘检测效果有较大的影响,
越大,检测到的图像细节越丰富,但抗噪能力下降,从而出现伪边缘,反之则抗噪能力提高,但边缘精度下降,易丢失许多真边缘,因此,对于不同图像应选择不同参数。
Roberts算子:
采用对角线方向相邻两像素之差表示信号的突变,检测水平和垂直方向边缘的性能好于斜线方向,定位精度比较高,但对噪声敏感,检测出的边缘较细。
Prewitt算子:
对噪声有平滑作用,检测出的边缘比较粗,定位精度低,容易损失角点。
Sobel算子:
产生的边缘效果较好,对噪声具有平滑作用。
但存在伪边缘,边缘比较粗且定位精度低。
Laplacian算子:
是二阶微分算子,对图像中的阶跃性边缘点定位准确,对噪声非常敏感,丢失一部分边缘的方向信息,造成一些不连续的检测边缘。
Canny算子:
采用高斯函数对图像进行平滑处理,因此具有较强的噪声抑制能力;同样该算子也将一些高频边缘平滑掉,造成边缘丢失,采用了双阈值算法检测和连接边缘,边缘的连续性较好。
4、调试过程中出现的问题及相应解决办法
4.1代码在运行过程中的错误:
[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','ImageFiles(*.bmp,*.jpg,*.png,*.jpeg)';...
'*.*','AllFiles(*.*)'},...
'Pickanimage');
axes(handles.axes_src);
fpath=[pathnamefilename];
此代码缺少了imread读入图片,因此不能够正确的运行。
应在代码后面加入如下代码:
img_src=imread(fpath);
4.2图像运行过程中出现的错误:
应该将代码中的I=rgb2gray();改为I=rgb2gray(I);
五、程序运行截图及其说明
5.1Roberts算子图像边缘检测截图如图(4)所示
图(4)
5.2Prewitt算子图像边缘检测截图如图(5)所示
图(5)
5.3Sobel算子图像边缘检测如图(6)所示
图(6)
5.4Laplacian算子图像边缘检测如图(7)所示
图(7)
5.5Canny算子图像边缘检测如图(8)所示
图(8)
6、简单操作手册
本系统主要是对图像边缘检测中一阶微分算子,二阶微分算子等的实现,以Sobel为例,在程序实现的过程中主要步骤有以下几点:
6.1程序执行的初始界面如图(9)所示
图(9)
6.2打开图象进行Sobel算子边缘检测界面如图(10)所示
图(10)
6.3经Sobel算子处理后的图象如图(11)所示
图(11)
6.4退出程序
设计总结
虽然这次课程设计只有二个星期的时间,但是我们对图像处理的各种方法及应用有了更深的理解,学会了应用MATLAB软件及GUI来实现界面的操作和编程处理。
MATLAB是我们在以前和以后的学习工作中都会经常应用到的软件,但是在以前还是对其了解不足,操作不是很了解,在实习之初便因为这个问题而无从下手。
于是我们寻找了许多这方面的书籍以及应用网络教程来对其进行学习,逐渐的增强了对MATLAB及GUI的了解,能够摸索着开始进行编写。
实习中也遇到了很多问题,但通过查阅书籍、同学间讨论、请教老师以及网上查找最终能够得以解决,完成这次实习。
通过这次课程设计,对其的一些常见函数以及与图像处理相关的函数都比较了解,并能够应用这些函数来解决图像处理的问题。
GUI对于我们是一个新的知识,通过各方面的学习,我们最终对GUI也有了比较深的了解,能够很顺利的应用GUI来设计出适合并且美观的界面。
图像处理是我们这学期的一门很重要的课程,在课上虽然学习了很多知识,但是不经过自己动手操作而只看到书上的一些概念和处理的图片并不能很清楚的了解到各种操作的效果,并且不动手操作,知识就只能局限于书本上。
经过这次课程设计,不但能够让我们再次复习了本学期所学的图像处理的知识,加深了对这些知识的记忆,并且让我们对图像处理的各种处理方法如Sobel算子、Robert算子、Priwitt算子、拉普拉斯算子、Canny等对图像产生的效果有了更加直观的了解,不但加深了记忆也能因此更加了解各种处理方法的应用,可以用MATLAB软件来对这些处理来实现。
这次课程设计要实现的内容比较多,其中有一些易操作的也有一些比较复杂的,在实习过程中也会遇到一些难以突破的问题,但是在这个过程中需要我们耐心的学习,一步一步通过各种途经学习到解决的方法,也培养了我们的耐心和学习的能力。
这次是两人一组的实习,因此合理的分工合作也是很重要的,通过实习也培养了我们之间分工协作互帮互助的精神。
总体来说,我们的这次课程设计还是比较成功的,较为成功的完成了我们的边缘图像检测,并且达到到了我们这次课程设计的目的。
参考资料
[1]朱虹.数字图像处理基础[M].科学出版社,2005
[2]RC.Gonzalez,RE.Woods著,阮秋琦,阮宇智等译.数字图像处理(第2版).北京:
电子工业出版社,2003
[3]K.R.Castleman.数字图像处理.北京:
电子工业出版社,2002
[4]章毓晋.图像处理与分析-图像工程(上册),清华大学,2001
[5]何斌等编著.VisualC++数字图像处理.人民邮电出版社,2002
[6]张宏林编著.VisualC++数字图像模式识别技术及工程实践.人民邮电出版社,2003.
[7]黄维通.VisualC++面向对象与可视化程序设计.清华大学出版社,2003
[8]RC.Gonzalez,RE.Woods,SL.Eddins著,阮秋琦,阮宇智等译.数字图像处理(MATLAB版).北京:
电子工业出版社,2005
[9]李赤枫,王俊,李克,等.自生Mg2Si颗粒增强Al基复合材料的组织细化[J].中国有色金属学报,2004,14
(2):
233-237.
[10]殷声.燃烧合成[M].北京:
冶金工业出版社,2004:
25-44.
[11]王文新.大象征收过路费.2006.5.21
致谢
在这次课程设计的设计过程中,我得到了许多人的帮助。
首先我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。
在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。
其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的代码难题,在一个个小问题上给了我很大的帮助。
最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学。
附录
functionvarargout=Mywork(varargin)
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'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
functionMywork_OpeningFcn(hObject,eventdata,handles,varargin)
setappdata(handles.figure_Mywork,'img_src',0);
handles.output=hObject;
guidata(hObject,handles);
functionvarargout=Mywork_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionm_file_Callback(hObject,eventdata,handles)
functionm_file_open_Callback(hObject,eventdata,handles)
[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','ImageFiles(*.bmp,*.jpg,*.png,*.jpeg)';...
'*.*','AllFiles(*.*)'},...
'Pickanimage');
axes(handles.axes_src);%用axes命令设定当前操作的坐标轴是axes_src
fpath=[pathnamefilename];%将文件名和目录名组合成一个完整的路径
img_src=imread(fpath);%用imread读入图片,并用imshow在axes_src上显示
imshow(img_src);
title('原图');
setappdata(handles.figure_Mywork,'img_src',img_src);
functionm_file_save_Callback(hObject,eventdata,handles)
[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','ImageFiles(*.bmp,*.jpg,*.png,*.jpeg)';...
'*.*','AllFiles(*.*)'},...
'Pickanimage');
axes(handles.axes_src);%用axes命令设定当前操作的坐标轴是axes_src
fpath=[pathnamefilename];%将文件名和目录名组合成一个完整的路径
img_src=imread(fpath);imshow(img_src);
img_src=getappdata(handles.figure_Mywork,'img_src');
functionm_file_exit_Callback(hObject,eventdata,handles)
close(handles.figure_Mywork);
functionm_image_Callback(hObject,eventdata,handles)
functionm_sobel_Callback(hObject,eventdata,handles)
axes(handles.axes_src);%用axes命令设定当前操作的坐标轴是axes_src
img_src=getappdata(handles.figure_Mywork,'img_src');
A=img_src;
axes(handles.axes_src);
imshow(A);title('原图');
y_mask=[-1-2-1;000;121];%建立Y方向的模板
x_mask=y_mask';%建立X方向的模板
I=im2double(A);%将图像数据转化为双精度
dx=imfilter(I,x_mask);%计算X方向的梯度分量
dy=imfilter(I,y_mask);%计算Y方向的梯度分量
grad=sqrt(dx.*dx+dy.*dy);%计算梯度
grad=mat2gray(grad);%将梯度矩阵转换为灰度图像
level=graythresh(grad);%计算灰度阈值
axes(handles.axes_dst);
BW=im2bw(grad,level);%用阈值分割梯度图像
imshow(BW);%显示分割后的图像即边缘图像
title('Sobel')
functionm_Roberts_Callback(hObject,eventdata,handles)
img_src=getappdata(handles.figure_Mywork,'img_src');
A=img_src;
axes(handles.axes_src);