图像分割程序设计汇总.docx
《图像分割程序设计汇总.docx》由会员分享,可在线阅读,更多相关《图像分割程序设计汇总.docx(25页珍藏版)》请在冰豆网上搜索。
图像分割程序设计汇总
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2012年秋季学期
图像处理综合训练
题目:
图像分割程序设计
专业班级:
姓名:
学号:
指导教师:
成绩:
目录
摘要1
一、前言2
二、算法分析与描述3
三、详细设计过程5
四、调试过程中出现的问题及相应解决办法8
五、程序运行截图及其说明8
六、简单操作手册12
设计总结15
参考资料16
致谢17
附录18
摘要
图像分割就是从图像中将某个特定区域与其他部分进行分离并提取出来的处理图像分割处理实际上就是区分图像中的“前景目标”和“背景”所以通常又称之为图像的二值化处理。
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。
它是由图像处理到图像分析的关键步骤。
现有的图像分割方法主要分以下几类:
基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。
近年来,研究人员不断改进原有的图像分割方法并把其它学科的一些新理论和新方法用于图像分割,提出了不少新的分割方法。
关键词:
图像分割;阈值;二值化;
一、前言
图形图像处理的应用领域涉及人类生活和工作的各个方面,它是从60年代以来随计算机的技术和VLSI的发展而产生、发展和不断成熟起来的一个新技术领域理论上和实际应用上都并取得了巨大的成就。
数字图像处理与模拟图像处理的根本不同在于,它不会因图像的存储、传输或复制等一系列变换操作而导致图像质量的退化,所以图形图像的处理在我们的生活中又很重要的作用。
在对图像的研究和应用中,人们往往只对图像中的某些部分感兴趣。
这些部分通常称为目标或前景,它们一般对应图像中特定的、具体独特性质的区域。
为了辨识和分析目标,需要将它们分别提取出来,在此基础上才有可能对目标进一步利用。
图像分割就是指把图像分成各具特性的区域并提取出感兴趣的目标的技术和过程。
在图象分析中,通常需将所关心的目标从图象中提取出来,即图象的分割。
图象分割在图象分析,图象识别,图象检测等方面占有非常重要的位置。
二、算法分析与描述
1.图像分割的数学描述
令集合R代表整个区域,对R的分割可看作将R分成若干个满足以下5个条件的非空子集(子区域)R1,R1,…Rn
(1)所有子集构成图像;
(2)各子集不重叠;
(3)每个子集中的像素有某种共同的属性;
(4)不同的子集属性不同;
(5)每个子集中的所有像素应该是连通的。
2.基于灰度直方图的峰谷法
图像的灰度直方图必须是双峰的直方图的左侧峰为亮度较高的部分,这部分恰好对应于较暗的背景部分,直方图的右侧为亮度较高的部分,这里恰好对应于会面中图案部分。
显然灰度直方图的峰谷法是一种有效且非常简单的阈值方法,但是该方法有一个局限性就是灰度值放度必须是双峰的。
3.区域生长
区域生长的基本思想是将具有相似性质的像素集合起来构成区域。
具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。
将这些新像素当作新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来。
这样一个区域就长成了。
区域生长需要选择一组能正确代表所需区域的种子像素,确定在生长过程中的相似性准则,制定让生长停止的条件或准则。
相似性准则可以是灰度级、彩色、纹理、梯度等特性。
选取的种子像素可以是单个像素,也可以是包含若干个像素的小区域。
大部分区域生长准则使用图像的局部性质。
生长准则可根据不同原则制定,而使用不同的生长准则会影响区域生长的过程。
区域生长法的优点是计算简单,对于较均匀的连通目标有较好的分割效果。
它的缺点是需要人为确定种子点,对噪声敏感,可能导致区域内有空洞。
另外,它是一种串行算法,当目标较大时,分割速度较慢,因此在设计算法时,要尽量提高效率。
3、详细设计过程
1.流程图
2.区域生长法
区域生长法的数学表达:
一致性判别条件:
灰度变化阈值:
生长准则:
为待测生长的点领域内的灰度值
Matlab代码:
globalA0
A0=getimage;
axes(handles.axes2);
seed=[100,220];
thresh=15;
A=rgb2gray(A0);
A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);
A=double(A);
B=A;
[r,c]=size(B);
n=r*c;
pixel_seed=A(seed
(1),seed
(2));
q=[seed
(1)seed
(2)];
top=1;
M=zeros(r,c);
M(seed
(1),seed
(2))=1;
count=1;
whiletop~=0
r1=q(1,1);
c1=q(1,2);
p=A(r1,c1);
dge=0;
fori=-1:
1
forj=-1:
1
ifr1+i<=r&r1+i>0&c1+j<=c&c1+j>0
ifabs(A(r1+i,c1+j)-p)<=thresh&M(r1+i,c1+j)~=1
top=top+1;
q(top,:
)=[r1+ic1+j];
M(r1+i,c1+j)=1;
count=count+1;
B(r1+i,c1+j)=1;
end
ifM(r1+i,c1+j)==0;
dge=1;
end
else
dge=1;
end
end
end
ifdge~=1
B(r1,c1)=A(seed
(1),seed
(2));
end
ifcount>=n
top=1;
end
q=q(2:
top,:
);
top=top-1;
end
imshow(B,[]);
title('区域生长分割');
handles.img=B;
guidata(hObject,handles);
3.基于灰度直方图的峰谷法
由封谷法的概念可得Matalb代码:
globalI
axes(handles.axes2);
I=getimage;
ifndims(I)==3
I=rgb2gray(I);
end
fxy=imhist(I,256);%统计每个灰度值的个数
%figure;
%subplot(2,2,1);
%imshow(I,[]);
%title('原图')
%subplot(2,2,2);
plot(fxy);%画出灰度直方图
%title('直方图')
p1={'InputNum:
'};
p2={'180'};
p3=inputdlg(p1,'InputNum:
1~256',1,p2);
p=str2num(p3{1});
p=p/255;
bw=im2bw(I,p);%小于阈值的为黑,大于阈值的为白
%subplot(2,2,3);
4、调试过程中出现的问题及相应解决办法
问题一:
最初的调试过程中总是区域生长算法调试不成功,并且matlabgui的设计过程也出现了很多问题,最后发现调用函数方法错误,最后通过查matlab基础资料得到解决。
问题二:
在设计gui的时候每次都是处理后的图像坐标位置没有放到固定的区域,通过查找matlabgui设计资料解决了问题。
5、程序运行截图及其说明
1.文件打开读取处理图片截图如下:
图6.1原图
2.点击峰谷法分割图像并截图得:
图6.2峰谷法分割
3.点击区域生长法分割图像截图得:
图6.3区域生长法分割
六、简单操作手册
图6.1“文件打开”按路径打开图像文件
图6.2“保存”按路径保存处理完的图像文件
图6.3“峰谷法分割图像”对已打开的图像按阈值进行峰谷法分割处理
图6.4“区域生长法分割图像”对已打开的图像进行区域生长法分割处理
设计总结
我们知道人类所获得信息的70%以上来自视觉,换句话说人类将用自己双眼所观察到的世界进行缜密的分析与思考之后,推动了科技的进步也推动了整个世界的发展。
经过了为期两周的课程设计,我深刻的感受到了图像处理的强大,与此同时,感受到更多的就是编程的辛苦,只要一个小地方出错以后,就要对整个程序进行又一遍的检查,真可为是牵一发而动全身呀,在当初做的时候,虽让将每一个功能模块的代码都写出来,但是在将他们整合起来的时候,在传值和做图形用户界面的时候出现了很大的问题,最终还是通过网络和咨询同学才得以解决问题,所以在这要衷心的感谢网络和同学们。
参考资料
[1]朱虹.数字图像处理基础[M].科学出版社,2005
[2]RC.Gonzalez,RE.Woods著,阮秋琦,阮宇智等译.数字图像处理(第2版).北京:
电子工业出版社,2003
[3]K.R.Castleman.数字图像处理.北京:
电子工业出版社,2002
[4]章毓晋.图像处理与分析-图像工程(上册),清华大学,2001
[5]RC.Gonzalez,RE.Woods,SL.Eddins著,阮秋琦,阮宇智等译.数字图像处理(MATLAB版).北京:
电子工业出版社,2005
致谢
首先,我要感谢我的指导老师,他严谨细致、一丝不苟的作风一直是我生活、学习中的榜样,给了起到了指明灯的作用;他们循循善诱的教导和不拘一格的思路给予我无尽的启迪,让我很快就感受到了设计的快乐并融入其中。
其次我要感谢同组同学对我的帮助和指点,没有他们的帮助和提供资料,没有他们的鼓励和加油,这次课程设计就不会如此的顺利进行,最后就是要感谢网络给我们提供了大量的资料。
附录
functionvarargout=keshe(varargin)
%KESHEMATLABcodeforkeshe.fig
%KESHE,byitself,createsanewKESHEorraisestheexisting
%singleton*.
%
%H=KESHEreturnsthehandletoanewKESHEorthehandleto
%theexistingsingleton*.
%
%KESHE('CALLBACK',hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinKESHE.Mwiththegiveninputarguments.
%
%KESHE('Property','Value',...)createsanewKESHEorraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforekeshe_OpeningFcngetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.Allinputsarepassedtokeshe_OpeningFcnviavarargin.
%
%*SeeGUIOptionsonGUIDE'sToolsmenu.Choose"GUIallowsonlyone
%instancetorun(singleton)".
%
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%Edittheabovetexttomodifytheresponsetohelpkeshe
%LastModifiedbyGUIDEv2.510-Jan-201317:
51:
00
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@keshe_OpeningFcn,...
'gui_OutputFcn',@keshe_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
%---Executesjustbeforekesheismadevisible.
functionkeshe_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstokeshe(seeVARARGIN)
%Choosedefaultcommandlineoutputforkeshe
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakeskeshewaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=keshe_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
%--------------------------------------------------------------------
functionopen_file_Callback(hObject,eventdata,handles)
%hObjecthandletoopen_file(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像');
ifisequal(filename,0)|isequal(pathname,0)
errordlg('没有选中文件','出错');
return;
else
file=[pathname,filename];
globalS%设置一个全局变量S,保存初始图像路径,以便之后的还原操作
S=file;
x=imread(file);
set(handles.axes1,'HandleVisibility','ON');
axes(handles.axes1);
imshow(x);
set(handles.axes1,'HandleVisibility','OFF');
axes(handles.axes2);
imshow(x);
handles.img=x;
guidata(hObject,handles);
end
%--------------------------------------------------------------------
functionsave_file_Callback(hObject,eventdata,handles)
%hObjecthandletosave_file(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
[sfilename,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');
if~isequal([sfilename,sfilepath],[0,0])
sfilefullname=[sfilepath,sfilename];
imwrite(handles.img,sfilefullname);
else
msgbox('你按了取消键','保存失败');
end
%--------------------------------------------------------------------
functionclose_file_Callback(hObject,eventdata,handles)
%hObjecthandletoclose_file(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
clc;
closeall;
close(gcf);
clear;
%---Executesonbuttonpressinfenggu.
functionfenggu_Callback(hObject,eventdata,handles)
%hObjecthandletofenggu(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%clc;clearall;closeall;
%I=imread('lena.jpg');
globalI
axes(handles.axes2);
I=getimage;
ifndims(I)==3
I=rgb2gray(I);
end
fxy=imhist(I,256);%统计每个灰度值的个数
%figure;
%subplot(2,2,1);
%imshow(I,[]);
%title('原图')
%subplot(2,2,2);
plot(fxy);%画出灰度直方图
%title('直方图')
p1={'InputNum:
'};
p2={'180'};
p3=inputdlg(p1,'InputNum:
1~256',1,p2);
p=str2num(p3{1});
p=p/255;
bw=im2bw(I,p);%小于阈值的为黑,大于阈值的为白
%subplot(2,2,3);
imshow(bw);
title('双峰阈值分割')
handles.img=bw;
guidata(hObject,handles);
%--------------------------------------------------------------------
functionm_file1_r_Callback(hObject,eventdata,handles)
%hObjecthandletom_file1_r(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%A=imread('C:
\Users\Administrator\Desktop\新建文件夹\lena.jpg');%读入图像
%---Executesonbuttonpressinquyu.
functionquyu_Callback(hObject,eventdata,handles)
%hObjecthandletoquyu(seeGCBO)
%eventdatareserved-tobedefinedinafuturever