当前位置:文档之家› 图像分割程序设计汇总

图像分割程序设计汇总

*******************实践教学*******************兰州理工大学计算机与通信学院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. 区域生长区域生长的基本思想是将具有相似性质的像素集合起来构成区域。

具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。

将这些新像素当作新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来。

这样一个区域就长成了。

区域生长需要选择一组能正确代表所需区域的种子像素,确定在生长过程中的相似性准则,制定让生长停止的条件或准则。

相似性准则可以是灰度级、彩色、纹理、梯度等特性。

选取的种子像素可以是单个像素,也可以是包含若干个像素的小区域。

大部分区域生长准则使用图像的局部性质。

生长准则可根据不同原则制定,而使用不同的生长准则会影响区域生长的过程。

区域生长法的优点是计算简单,对于较均匀的连通目标有较好的分割效果。

它的缺点是需要人为确定种子点,对噪声敏感,可能导致区域内有空洞。

另外,它是一种串行算法,当目标较大时,分割速度较慢,因此在设计算法时,要尽量提高效率。

三、详细设计过程1.流程图2.区域生长法区域生长法的数学表达:一致性判别条件:灰度变化阈值:生长准则:Matlab代码:global A0A0=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;while top~=0r1=q(1,1);c1=q(1,2);p=A(r1,c1);dge=0;for i=-1:1for j=-1:1if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1top=top+1;q(top,:)=[r1+i c1+j];M(r1+i,c1+j)=1;count=count+1;B(r1+i,c1+j)=1;endif M(r1+i,c1+j)==0;dge=1;endelsedge=1;endendendif dge~=1B(r1,c1)=A(seed(1),seed(2));endif count>=ntop=1;endq=q(2:top,:);top=top-1;endimshow(B,[]);title(' 区域生长分割');handles.img=B;guidata(hObject,handles);3. 基于灰度直方图的峰谷法由封谷法的概念可得Matalb代码:global Iaxes(handles.axes2);I=getimage;if ndims(I) == 3I = rgb2gray(I);endfxy = imhist(I, 256); %统计每个灰度值的个数%figure;%subplot(2, 2, 1);%imshow(I, []);%title('原图')%subplot(2, 2, 2);plot(fxy); %画出灰度直方图%title('直方图')p1 = {'Input Num:'};p2 = {'180'};p3 = inputdlg(p1,'Input Num:1~256',1,p2);p = str2num(p3{1});p = p/255;bw = im2bw(I, p); %小于阈值的为黑,大于阈值的为白%subplot(2, 2, 3);四、调试过程中出现的问题及相应解决办法问题一:最初的调试过程中总是区域生长算法调试不成功,并且matlab gui的设计过程也出现了很多问题,最后发现调用函数方法错误,最后通过查matlab基础资料得到解决。

问题二:在设计gui的时候每次都是处理后的图像坐标位置没有放到固定的区域,通过查找matlab gui设计资料解决了问题。

五、程序运行截图及其说明1.文件打开读取处理图片截图如下:图6.1 原图2.点击峰谷法分割图像并截图得:图6.2 峰谷法分割3.点击区域生长法分割图像截图得:图6.3区域生长法分割六、简单操作手册图6.1 “文件打开”按路径打开图像文件图6.2 “保存”按路径保存处理完的图像文件图6.3 “峰谷法分割图像”对已打开的图像按阈值进行峰谷法分割处理图6.4 “区域生长法分割图像”对已打开的图像进行区域生长法分割处理设计总结我们知道人类所获得信息的70%以上来自视觉,换句话说人类将用自己双眼所观察到的世界进行缜密的分析与思考之后,推动了科技的进步也推动了整个世界的发展。

经过了为期两周的课程设计,我深刻的感受到了图像处理的强大,与此同时,感受到更多的就是编程的辛苦,只要一个小地方出错以后,就要对整个程序进行又一遍的检查,真可为是牵一发而动全身呀,在当初做的时候,虽让将每一个功能模块的代码都写出来,但是在将他们整合起来的时候,在传值和做图形用户界面的时候出现了很大的问题,最终还是通过网络和咨询同学才得以解决问题,所以在这要衷心的感谢网络和同学们。

参考资料[1]朱虹. 数字图像处理基础[M]. 科学出版社, 2005[2] R C.Gonzalez, R E.Woods著,阮秋琦,阮宇智等译.数字图像处理(第2版).北京:电子工业出版社,2003[3] K.R.Castleman. 数字图像处理.北京:电子工业出版社,2002[4]章毓晋.图像处理与分析-图像工程(上册),清华大学,2001[5]R C.Gonzalez, R E.Woods, S L. Eddins著,阮秋琦,阮宇智等译.数字图像处理(MATLAB版).北京:电子工业出版社,2005首先,我要感谢我的指导老师,他严谨细致、一丝不苟的作风一直是我生活、学习中的榜样,给了起到了指明灯的作用;他们循循善诱的教导和不拘一格的思路给予我无尽的启迪,让我很快就感受到了设计的快乐并融入其中。

其次我要感谢同组同学对我的帮助和指点,没有他们的帮助和提供资料,没有他们的鼓励和加油,这次课程设计就不会如此的顺利进行,最后就是要感谢网络给我们提供了大量的资料。

function varargout = keshe(varargin)% KESHE MATLAB code for keshe.fig% KESHE, by itself, creates a new KESHE or raises the existing% singleton*.%% H = KESHE returns the handle to a new KESHE or the handle to% the existing singleton*.%% KESHE('CALLBACK',hObject,eventData,handles,...) calls the local% function named CALLBACK in KESHE.M with the given input arguments. %% KESHE('Property','Value',...) creates a new KESHE or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before keshe_OpeningFcn gets called. An% unrecognized property name or invalid value makes property application % stop. All inputs are passed to keshe_OpeningFcn via varargin.%% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".%% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help keshe% Last Modified by GUIDE v2.5 10-Jan-2013 17:51:00% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @keshe_OpeningFcn, ...'gui_OutputFcn', @keshe_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before keshe is made visible.function keshe_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)% varargin command line arguments to keshe (see VARARGIN)% Choose default command line output for keshehandles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes keshe wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line. function varargout = keshe_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structure varargout{1} = handles.output;% --------------------------------------------------------------------function open_file_Callback(hObject, eventdata, handles)% hObject handle to open_file (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像'); if isequal(filename,0)|isequal(pathname,0)errordlg('没有选中文件','出错');return;elsefile=[pathname,filename];global S %设置一个全局变量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% --------------------------------------------------------------------function save_file_Callback(hObject, eventdata, handles)% hObject handle to save_file (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)[sfilename ,sfilepath]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图像文件','untitled.jpg');if ~isequal([sfilename,sfilepath],[0,0])sfilefullname=[sfilepath ,sfilename];imwrite(handles.img,sfilefullname);elsemsgbox('你按了取消键','保存失败');end% --------------------------------------------------------------------function close_file_Callback(hObject, eventdata, handles)% hObject handle to close_file (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)clc;close all;close(gcf);clear;% --- Executes on button press in fenggu.function fenggu_Callback(hObject, eventdata, handles)% hObject handle to fenggu (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%clc; clear all; close all;%I = imread('lena.jpg');global Iaxes(handles.axes2);I=getimage;if ndims(I) == 3I = rgb2gray(I);endfxy = imhist(I, 256); %统计每个灰度值的个数%figure;%subplot(2, 2, 1);%imshow(I, []);%title('原图')%subplot(2, 2, 2);plot(fxy); %画出灰度直方图%title('直方图')p1 = {'Input Num:'};p2 = {'180'};p3 = inputdlg(p1,'Input Num: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);% --------------------------------------------------------------------function m_file1_r_Callback(hObject, eventdata, handles)% hObject handle to m_file1_r (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%A = imread('C:\Users\Administrator\Desktop\新建文件夹\lena.jpg'); % 读入图像% --- Executes on button press in quyu.function quyu_Callback(hObject, eventdata, handles)% hObject handle to quyu (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global A0A0=getimage;axes(handles.axes2);%A0=imread('lena.jpg');%读入图像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;%将A赋予B[r,c]=size(B);%图像尺寸r为行数,c为列数n=r*c;%计算图像所包含点的个数pixel_seed=A(seed(1),seed(2));%原图起始点灰度值q=[seed(1) seed(2)];%q用来装载起始位置top=1;%循环判断flagM=zeros(r,c);%建立一个与原图形同等大小的矩阵M(seed(1),seed(2))=1;%将起始点赋为1,其余为0count=1;%计数器while top~=0%循环结束条件r1=q(1,1);%起始点行位置c1=q(1,2);%起始点列位置p=A(r1,c1);%起始点灰度值dge=0;for i=-1:1%周围点的循环判断for j=-1:1if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0%保证在点周围范围之内if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1%判定条件?top=top+1;%满足判定条件top加1,top为多少,则q的行数有多少行q(top,:)=[r1+i c1+j];%将满足判定条件的周围点的位置赋予q,q记载了满足判定的每一外点M(r1+i,c1+j)=1;%满足判定条件将M中相对应的点赋为1count=count+1;%统计满足判定条件的点个数,其实与top此时的值一样B(r1+i,c1+j)=1;%满足判定条件将B中相对应的点赋为1endif M(r1+i,c1+j)==0;%如果M中相对应点的值为0将dge赋为1,也是说这几个点不满足条件dge=1;%将dge赋为1endelsedge=1;%点在图像外将dge赋为1endendend%此时对周围几点判断完毕,在点在图像外或不满足判定条件则将dge赋为1,满足条件dge为0 if dge~=1%最后判断的周围点(i=1,j=1)是否满足条件,如dge=0,满足。

相关主题