matlab课程设计图像区域分割系统设计Word文件下载.docx
《matlab课程设计图像区域分割系统设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《matlab课程设计图像区域分割系统设计Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
在掌握数字图像处理基本算法的基础上,利用MATLAB、VC++、Python等编程语言设计具有指定功能的图形用户界面。
二、课程设计内容
1、设计一个实现图像区域分割功能的界面
2、界面可以采用MATLAB、VC++、Python等编程语言设计
3、要求界面能够读入并显示图片,通过各种控件选择并进行图像的分割操作,操作结果在对比窗口中显示
4、图像区域分割功能至少包括直方图阈值法、Otsu阈值法、迭代阈值法、区域生长与分裂合并法等,每项功能可采用一个或多个算法实现
三.课程设计要求
1、要求每个同学独立完成设计任务。
2、课程设计说明书封面格式要求见《课程设计说明书格式要求》。
3、课程设计的说明书要求简洁、通顺,图像表达内容完整、清楚、规范。
4、课程设计说明书要求:
1)说明题目的设计原理和思路、采用方法及设计流程。
2)可采用图表或文字对图形用户界面各子模块的功能以及各子模块之间的关系做较详细的描述。
3)详细说明代码的编写流程。
4)采用图像及文字详细说明各功能的演示结果。
指导教师(签字):
系主任(签字):
批准日期:
2018年 12 月 7 日
目录
第1章设计方案 1
1.1图像分割 1
1.2图形用户界面 1
第2章设计原理 2
2.1基于阈值的图像分割 2
2.1.1直方图阈值法 2
2.1.2Otsu阈值法 2
2.1.3迭代阈值法 2
2.2基于区域的图像分割 3
2.2.1区域生长法 3
2.2.2区域分裂合并法 3
第3章功能实现 4
3.1GUI界面设计 4
3.2各模块功能实现 4
第4章设计结果及分析 7
4.1设计结果 7
4.2设计结果分析 11
总结 12
第1章设计方案
1.1图像分割方法
图像分割是指利用图像的某些特征,如灰度、颜色、纹理等,将图像划分为多个组成区域或从图像中提取感兴趣的目标区域。
这些特征在同一区域内表现出一致性或相似性,而在不同区域之间表现出显著区别。
而灰度图像分割的依据一般是像素灰度值的两个特性:
灰度相似性和灰度不连续性。
同一区域内部的像素一般具有灰度相似性,而在不同区域之间的边界上一般具有灰度不连续性。
因此根据像素灰度值的不同特性,图像分割方法可以分为利用区域间灰度不连续性的基于边界的图像分割方法和利用区域内灰度相似性的基于阈值的图像分割和基于区域的图像分割方法。
本课设主要利用基于阈值的图像分割法和基于区域的图像分割方法来对比分析各种方法实现图像分割的特点。
1.2图形用户界面
GUI(图形用户界面)一种全屏幕图形界面,用户通过点击设备(例如鼠标)操纵图形的屏幕元素。
在MATLAB中在命令行输入guide可以调出GUI设计界面。
在左侧菜单框中可以拖拽各种控件在界面内进行想要达到的界面布局。
然后双击某个控件进入该控件的属性检查器修改控件的个属性。
最后进入回调函数进行每个控件的代码编写,以实现想要完成的功能。
13
第2章设计原理
2.1基于阈值的图像分割
基于阈值的图像分割的基本原理是通过设定不同的阈值,将图像中的像素分为两类或多类,它是一种简单有效的图像分割方法,具有计算简单、容易实现的优点。
将像素分成两类的图像为二值图像,因此,两类像素的图像分割也称为图像二值化处理。
2.1.1直方图阈值法
1.基本思想
灰度直方图是数字图像处理中最简单和最有用的工具,它是灰度级的函数,描述的是图像中具有该灰度级的像素的个数。
灰度直方图概括了一幅图像的灰度级内容,任何一幅图像的直方图都包括了可观的信息,某些类型的图像还可由其直方图完全描述。
对于目标与背景的灰度级有明显差别的图像,通常采用直方图技术来确定阈值,一幅物体与背景对比明显的图像一般具有包含双峰的灰度直方图,物体中的像素产生直方图中的一个峰,而背景产生直方图中的另一个峰。
物体与背景的边界附近具有两个峰值之间的灰度级,其像素数目相对较少,从而产生了两峰之间的谷。
反过来,如果图像中物体与背景的对比明显,并且各个物体之间的灰度一致性较好,那么其对应的直方图一定是双峰直方图。
当分割阈值位于谷底时,图像分割可取得最好的效果。
2.1.2Otsu阈值法
最大类间方差法是一种自适应的阈值确定的方法,又叫大津法。
它是按图像的灰度特性,将图像分成背景和目标两部分。
背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。
因此,使类间方差最大的分割意味着错分概率最小。
由大津提出的最大类间方差法,是在判决分析最小二乘法原理的基础上推导得出的,其算法比较简单,是一种方便可行的阈值选取方法。
2.算法步骤
(1)首先找出图像中的最高灰度级(L-1);
(2)然后分别取从0至L-1的每一灰度级作为阈值k;
(3)找出方差最大的阈值T。
2.1.3迭代阈值法
1.基本思想
迭代阈值法的基本思想是同一类别像素的灰度值具有较大的一致性,使用均值和方差作为均匀性度量的数字指标。
其基本原理是首先选取阈值的初始估计值,然后按照某种策略不断更新该估计值,直至收敛。
迭代法具有简单易行、执行速度快的优点,且所得阈值与Ostu阈值法基本相近。
当图像中前
景和背景区域面积相近时,图像的灰度均值是一种好的初始阈值的选择。
2.算法步骤
(1)为全局阈值T选择一个初始估计值。
(2)用T分割图像,将产生两组像素:
G1由灰度值大于T的所有像素组成,G2由所有小于等于T的像素组成。
(3)对G1和G2的像素分别计算平均灰度值m1和m2。
(4)计算一个新的阈值T=1/2(m1+m2)。
(5)重复步骤2到步骤4,直到连续迭代中的T值间的差小于一个预定义参数△T(用于控制迭代的次数;
越大执行的迭代次数越少)为止。
2.2基于区域的图像分割
基于阈值的图像分割方法没有考虑像素的空间位置关系,而图像分割的同一区域像素应该具有相似的特征,基于区域的图像分割方法充分考虑了像素极其空间邻域像素之间的关系。
传统的区域分割方法包括区域生长法和区域分裂合并法。
2.2.1区域生长法
区域生长的基本思想是将具有相似性质的像素集合起来构成区域。
具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。
将这些新像素当作新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来。
这样一个区域就长成了。
2.基本步骤:
(1)选择区域的种子像素。
(2)确定将相邻像素包括进来的准则。
(3)制定生长停止的规则(确定相似性准则)。
2.2.2区域分裂合并法
区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标提取。
分裂合并差不多是区域生长的逆过程:
从整个图像出发,不断分裂得到各个子区域,然后再把前景区域合并,实现目标提取。
分裂合并的假设是对于一幅图像,前景区域由一些相互连通的像素组成的,因此,如果把一幅图像分裂到像素级,那么就可以判定该像素是否为前景像素。
当所有像素点或者子区域完成判断以后,把前景区域或者像素合并就可得到前景目标。
(1)对任何区域Ri,如果P(Ri)=FALSE,就将每个区域都分裂为4个相连的不重叠区域;
(2)对相邻的两个区域Ri和Rj,如果满足P(RiURj)=TRUE,则进行合并。
合并的两个区域可以大小不同,即不在同一层。
(3)当再也没有可以进行合并或分裂的区域,则分割操作停止。
第3章功能实现
3.1GUI界面设计
本设计中界面采用MATLAB编程语言设计。
在命令行输入guide,点击回车,进去guide
界面之后,在新建GUI界面中选择“BlankGUI(Default)”,勾选设置图形文件保存的路径。
图3-1GUI界面设计
在GUI制作界面,左侧是控件和组件栏,可以拖动这些组件到界面上。
拖拽buttongroup,pushbutton,坐标系以及静态文本框等。
进行界面布局,如图3-1所示。
3.2各模块功能实现
1.在界面中拖拽两个pushbutton按钮,修改其属性,将string值分别改为“读入图片”、“退出”。
分别写其回调函数:
读入图片:
[filename,pathname]=uigetfile(...
{'
*.bmp;
*.jpg;
*.png;
*.tif;
*.jpeg'
'
ImageFiles(*.bmp;
*.jpeg)'
;
...'
*.*'
'
AllFiles(*.*)'
},...
'
PickanImage'
);
axes(handles.axes1);
fpath=[pathnamefilename];
img_src=imread(fpath);
globalS
S=img_src;
imshow(img_src);
退出界面:
clc;
closeall;
close(gcf);
clear;
2.分别创建两个坐标系,一个用来显示原图,一个显示分割处理后的图片。
3.在buttongroup中拖拽五个radiobutton修改其属性,将string值分别改为迭代阈值法,Ostu阈值法、直方图阈值法、区域生长法、区域分裂合并法。
Otsu阈值法代码:
case'
j2'
axes(handles.axes2);
globalST=graythresh(S);
g=im2bw(S,T);
imshow(g);
title('
otsu阀值法'
直方图阈值法代码:
j3'
globalSf=S;
I=f;
B=imhist(f);
axes(handles.axes2);
plot(B);
title('
原图直方图'
[m,n]=size(f);
prompt={'
选取合适的阀值:
};
defans={'
100'
p=inputdlg(prompt,'
阀值'
1,defans);
q=str2num(p{1});
fori=1:
mforj=1:
n
if(I(i,j)<
q)
I(i,j)=255;
elseI(i,j)=0;
end
endend
imshow(