图像OTSU阈值分割的程序设计Word格式.docx
《图像OTSU阈值分割的程序设计Word格式.docx》由会员分享,可在线阅读,更多相关《图像OTSU阈值分割的程序设计Word格式.docx(17页珍藏版)》请在冰点文库上搜索。
![图像OTSU阈值分割的程序设计Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/78044e3c-fa4a-4c66-8dc4-1fd4560425d0/78044e3c-fa4a-4c66-8dc4-1fd4560425d01.gif)
(1)掌握数字图像分割的基本原理;
(2)熟悉掌握matlab软件,并利用matlab设计一程序完成以下功能;
(3)根据OTSU(最大类间方差法)原理,设计求取阈值的程序(不能使用Matlab的库函数),并与用Matlab的库函数求得的阈值进行比较;
(4)用求得的阈值对一灰度图片进行分割,并对结果进行分析;
(5)要求阅读相关参考文献不少于5篇;
(6)根据课程设计有关规范,按时、独立完成课程设计说明书。
时间安排:
(1)布置课程设计任务,查阅资料,确定方案四天;
(2)进行编程设计一周;
(3)完成课程设计报告书三天;
指导教师签名:
年月日
系主任(或责任教师)签名:
摘要
数字图像处理的目的之一是图像识别,而图像分割是图像识别工作的基础。
图像分割的算法有阈值分割法,边缘检测法,区域分割等,本设计重点介绍了阈值分割法中的最大类间方差法(OTSU)的原理,matlab的实现代码与运行结果,并与matlab自带的库函数运行结果进行比较,还扩展了迭代法分割,手动输入一个阈值进行分割。
本程序中很多地方都有输入输出提示,有一定的人机交互。
关键词:
OTSU;
图像分割;
matlab;
1原理与实现
1.1图像分割
数字图像处理的目的之一是图像识别,而图像分割是图像识别工作的基础。
图像分割是将图像分成一些有意义的区域,然后对这些区域进行描述,相当于提取出某些目标区域图像的特征,判断图像中是否有感兴趣的目标。
图像分割的基础是像素间的相似性和跳变性。
所谓“相似性”是指在某个区域内像素具有某种相似的特性,如灰度一样,纹理相同;
所谓“跳变性”是指特性不连续,如灰度值突变等。
从总体上说,图像分割就是把图像分成若干有意义的区域的处理技术。
这些区域互不交叠,每一个区域内部的某种特性或特征相同或接近,而不同区域间的图像特征则有明显差别,即同一区域内部特性变化平缓,相对一致,而区域边界处则特性变化比较剧烈。
区域内是一个所有像素都有相邻或相接触像素的集合,是像素的连通集。
在一个连通集中任意两个像素之间,都存在一条完全由这个集合的元素构成的连通路径。
连通路径是一条可在相邻像素间移动的路径。
所以,在一个连通集中,你可以跟踪在任意两个像素间的连通路径而不离开这个集合。
图像分割的方法有多种,依据工作对象来分,可分为点相关分割和区域相关分割;
按算法分类,可分为阈值法、界限检测法、匹配法、跟踪法等。
近年来出现了一些新的算法和设想。
如先使用经典的边缘检测算子对图像做初步的边缘检测,然后再利用边缘之间空间结构关系来协调,增强初始检测结果。
1.2阈值分割
阈值处理是一种区域分割技术,将灰度根据主观愿望分成两个或多个等间隔或不等间隔灰度区间,它主要是利用图像中要提取的目标物体和背景在灰度上的差异,选择一个合适的阈值,通过判断图像中的每一个像素点的特征属性是否满足阈值的要求来确定图像中该像素点属于目标区还是应该属于背景区域,从而产生二值图像,它对物体与背景有较强对比景物的分割特别有用。
它计算简单,而且总能用封闭而且连通的边界定义不交叠的区域。
在使用阈值法进行分割技术时,阈值的选取成为能否正确分割的关键,若将所有灰度值大于或等于某阈值的像素都被判属于物体,则将所有灰度值小于该阈值的像素被排除在物体之外,如果阈值选取得过高,则过多的目标区域将被划分为背景,相反如果阈值选取得过低,则过多的背景将被划分到目标区。
因此,边界就由这样一些内部点的集合组成,这些点都至少有一个邻点不属于该物体。
由于物体和背景以及不同物体之间的灰度级有明显的差别,因此,在图像的灰度级直方图中会呈现明显的峰值。
当图像灰度直方图峰型分布明显时,常以谷底作为门限候选值。
所以只要适当地选择阈值,即可对图像进行分割,因而成为一种简单而广泛应用的方法。
1.3OTSU算法
OTSU算法,又称最大类间方差法,是由日本学者大津(NobuyukiOtsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。
它是按图像的灰度特性,将图像分成背景和目标2部分。
背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。
因此,使类间方差最大的分割意味着错分概率最小。
设X是一幅具有L级灰度级的图像,其中第i级像素为
个,其中i的值在0~L-1之间,图像的总像素点个数为:
(1)
第i级出现的概率为:
(2)
在OTSU算法中,以阈值k将所有的像素分为目标
和背景
两类。
其中,
类的像素灰度级为0~k-1,
类的像素灰度级为k~L-1。
图像的总平均灰度级为:
(3)
类像素所占的总面积的比例为:
(4)
(5)
类像素的平均灰度级为:
(6)
(7)
(8)
(9)
最大类间方差的公式为:
(10)
令k从0~L-1变化,计算在不同k值下的类间方差
,使得
最大值时的那个k值就是所要求的最优阈值。
1.4迭代法
迭代法的原理是:
图像中前景与背景之间的灰度分布为相互不均衡,在这个前提下,实现对两类对象的阈值分割。
其算法步骤如下:
(1)设定参数
,选择一个T的初始阈值估计值
。
(2)用
分割图像。
将图像分成两组像素:
由所有灰度值大于
的像素组成,而
的所有灰度值小于或等于
的像素组成。
(3)对区域
和
中的所有像素计算平均灰度值
(4)计算新的阈值:
=(
+
)/2.
(5)如果
,则推出,
即所求的全局阈值;
否则,将
赋给
,重复步骤
(2)~(5)。
2程序设计
程序除了有题目中要求的自编程序实现最大类间方差法外,还扩展了手动输入阈值进行分割和迭代法阈值分割,功能较多,为了使程序有良好的人机界面,主程序中提供了简单的菜单界面。
同时为了增加程序的可读性,分模块编写,然后在主函数中调用。
2.1主程序
functionmain%主程序
clear;
closeall;
%清除变量,关闭所有窗口
[namepath]=uigetfile('
*.jpg'
);
%获取图片路径及文件名
I=imread([pathname]);
%读图
I=rgb2gray(I);
%彩色转黑白
while1%循环执行
disp('
0原图1OTSU2全局阈值3迭代法4退出'
%提示信息
select=input('
请选择:
'
%选择相应功能
switchselect
case0
yuantu(I);
%输入0显示原图
case1%输入1OTSU法
fun1(I);
case2%输入2全局阈值法
fun2(I);
case3
fun3(I)%输入3迭代法
case4
return;
%输入4退出
otherwise%其他值不处理
end
end
2.2OTSU
functionfun1(I)%阈值计算程序
Ni=imhist(I);
%计算直方图数组
N=sum(Ni);
%总像素点个数
delamax=0;
%类间方差最大值
threshold=0;
%阈值
fork=2:
255
u=dot([0:
255],Ni/N);
%图像的总平均灰度级
w0=sum(Ni(1:
k)/N);
%C0类像素所占面积的比例
w1=1-w0;
%C1类像素所占面积的比例
ifw0==0|w0==1%当w0为1或0时提前结束本次循环
continue
u0=dot([0:
k-1],Ni(1:
k)/N)/w0;
%C0类像素的平均灰度
u1=dot([k:
255],Ni(k+1:
256)/N)/w1;
%C1类像素的平均灰度
dela(k)=w0*(u-u0)^2+w1*(u-u1)^2;
%类间方差公式
%求出类间方差的最大值,最大时的那个值对应的k值存入delamax
ifdela(k)>
delamax
delamax=dela(k);
threshold=k-1;
BW1=im2bw(I,threshold/255);
%阈值分割
figure
imshow(BW1),title('
自编程序运行结果'
)%显示图片
自编程序求的的阈值:
)%显示提示信息
disp(threshold)%显示结果
%调用系统函数OTSU阈值分割
level=graythresh(I);
%调用系统函数计算阈值
BW2=im2bw(I,level);
imshow(BW2),title('
调用库函数运行结果'
)
level=round(level*255);
调用库函数求得的阈值:
disp(level)
2.3全局阈值
functionfun2(I)%阈值分割程序
[widthheight]=size(I);
;
%获取图片宽高
th=input('
请输入阈值:
fori=1:
width
forj=1:
height
if(I(i,j)<
th)%灰度小于阈值时则为黑色
BW1(i,j)=0;
else%灰度大于等于阈值时则为白色
BW1(i,j)=1;
全局阈值'
2.4迭代法
functionfun3(I)%迭代法求阈值
J=double(I);
T=(min(J(:
))+max(J(:
)))/2;
%T的初始阈值
done=false;
%done的初始值为false
i=0;
while~done%当done为false是则执行循环
r1=find(J<
=T);
%找出不大于T的所有像素点索引值
r2=find(J>
T);
%找出大于T的所有像素点索引值
Tnew=(mean(J(r1))+mean(J(r2)))/2;
%计算新的阈值
done=abs(Tnew-T)<
1;
%判断|T2-T1|是否小于T0
T=Tnew;
i=i+1;
J(r1)=0;
%小于等于阈值的为黑
J(r2)=1;
%大于阈值的为白
imshow(J),title('
迭代法求阈值'
functionyuantu(I)%显示原图
imshow(I);
title('
原图'
3结果与分析
将程序文件名保存为main.m,以下为MATLAB主窗口运行的过程与结果
以下为不同的算法得到的阈值分割结果
图3全局阈值
图4迭代法
图6系统函数运行结果
图5自编程序运行结果
结果分析:
调用系统函数与自编的程序求得的阈值一样,处理的结果完全一样。
手动输入阈值分割的话只要输入的阈值和OTSU算出的阈值一样,处理结果就完全一样。
另外采用迭代法,通过多次用不同的图片处理发现算出的阈值和最大类间方差法基本一样,但有时会有误差,处理结果基本一样。
4心得体会
经过两周的努力努力,总算把专业综合课程设计做完了。
通过该课程设计,全面系统的理解了数字图像处理的一般原理和基本实现方法。
把死板的课本知识变得生动有趣,激发了学习的积极性。
把学过的数字图像处理基础原理的知识强化,能够把课堂上学的知识通过自己编写的程序表示出来,加深了对理论知识的理解。
在这次课程设计中,我先是认真阅读课本上的相关知识,理解透后又翻阅关于matlab的书籍,学习matlab中一些函数及运算符的用法。
总体来说,这次课设我学到了很多。
在设计过程中,加深了对可内知识的理解就,真正懂得了学以致用,熟悉了matlab的使用,了解了matlab在数字图像处理中的重大应用。
做课程设计我体会到了设计的艰辛的同时,更让我体会到成功的喜悦和快乐.这次数字图像处理课程设计,虽然短暂但是让我得到多方面的提高:
首先,提高了我们的对matlab语言的运用能力。
以前也曾用matlab做过课程设计,但以前写的程序既没有人机交互功能,这次课程设计首次运用模块化思想,将多个功能分模块编写,然后通过主函数调用,并且有一定的人机交互。
matlab程序设计中也有顺序、选择、循环三种结构,这一点和C语言很像。
其次,掌握了数字图像的原理及运用matlab进行图像处理的方法。
通过matlab中提供的图片读取函数可以将一幅黑白图片转换为二维数组,然后运用C语言里掌握的编程思想和图像处理的原理,就能编写出相应程序。
以前用过photoshop之类的软件进行过图像处理,但未能理解数字图像处理的本质。
通过此次课程设计,能够自己编写函数来进行图像处理,有一种成就感。
最后,查阅参考书和资料的独立思考的能力以及培养非常重要。
Matlab我们在设计程序时,遇到很多不曾用过的函数,如im2bw。
一方面我们可以查看教材和参考书,另一方面通过网络为我们提供了丰富的学习资源,我们可以快速的在网上查到某个函数的详细用法说明,还能找到很多别人的程序。
参考文献
[1]邱光源,电路,高等教育出版社,2005
[2]张强,王正林,精通MATLAB图像处理,电子工业出版社,1997
[3]吴锡龙,电路分析,高等教育出版社,2004
[4]陈怀琛,MATLAB及其在课程中的应用指南,西安电子科技大学出版社,2000
[5]朱习军,MATLAB在信号与系统与图象处理中的应用,电子工业出版社,2002