摘要
1原理与实现 1
1
1
OTSU 算法 2
2设计实现程序 4
3程序运行结果与分析 7
7
9
4心得体会 11
参考文献 12
方差:2(k),使得2(k)最大值时的 那个k值就是所要求的最优阈值。
方法二:使用库函数的算法
在matlab工具箱提供的graythresh函数求取阈值采用的就是OTSI算法,使用 库函数求取阈值就是调用graythresh函数选择阈值。
2设计实现程序
依据本次课程设计的要求,在程序设计中,我用了非库函数和库函数两种方法 进行图像的阈值求取,然后将图像进行人工选择不同阈值的阈值分割,以便进 行对 比。由于要实现的功能不止一个,程序比较复杂,所以为了方便程序的阅读与理 解,我将程序进行分模块编写。具体程序如下:
fun cti on main
%主程序 clear;closeall;
%清除变量,关闭所有窗口
[n ame path]=uigetfile('e\);
%获取图片路径及文件名 l=imread([path n ame]);
%读图 I=rgb2gray(l);
%彩色转黑白
while 1
%循环执行
disp('0原图1 OTSU 2全局阈值'); %显示功能提示信息
select=input(请选择:');
%选择相应功能
switch select
case0
yua ntu(l);
case1
fun 1(I);
case2
fun 2(I);
otherwise
end
%输入0显示原图
%输入1 OTSU法
%输入2全局阈值法
%其他值不处理
end fun ctio n yua ntu(l) %显示原图 figure imshow(I);title ('原图')
fun ctio n fun 1(I) %阈值计算程序
%计算直方图数组
N=sum(Ni);
%总像素点个数
delamax=O;
%类间方差最大值
threshold=0;
%阈值
for k=2:255
u=dot([0:255],Ni/N);
%图像的总平均灰度级
w0=sum(Ni(1:k)/N);
%C0类像素所占面积的比例
w1=1-w0;
%C1类像素所占面积的比例
if w0==0|w0==1
con ti nue
%当w0为1或0时提前结束本次循环
end
u0=dot([0:k-1],Ni(1:k)/N)/w0;
%C0类像素的平均灰度
u 仁 dot([k:255],Ni(k+1:256)/N)/w1;
%C1类像素的平均灰度
dela(k)=w0*(u-u0)A2+w1*(u-u1)A2;
%求出类间方差的最大值,最大时的那个值对应的k值存入delamax
%类间方差公式
if dela(k)>delamax
delamax=dela(k);
threshold=k-1;
end
end
BW 仁 im2bw(l,threshold/255);
%阈值分割
figure
imshow(BW1),title('自编程序运行结果')%显示图片
disp(自编程序求的的阈值:’)
%显示提示信息
disp(threshold)
%显示结果
%调用系统函数OTSU阈值分割
level=graythresh(l);
%调用系统函数计算阈值
BW2=im2bw(l,level);
%阈值分割
figure
%四舍五入计算调用系统函数的阈值
%阈值分割程序
%获取图片宽高
%灰度小于阈值时则为黑色
%灰度大于等于阈值时则为白色
imshow(BW2),title(调用库函数运行结果') level=rou nd(level*255);
disp('调用库函数求得的阈值:’)
disp(level)
fun ction fun 2(1)
[width height]=size(l);
th=input('请输入阈值:');
for i=1:width
for j=1:height
if(I(i,j)vth)
BW1(i,j)=0;
else
BW1(i,j)=1;
end
end
end
figure
imshow(BW1),title('全局阈值')
3程序运行结果与分析
运行matlab,输入程序运行,按照要求输入指令得到以下结果:
匚 ommand Window
New to MATLAB? Watch t
OTSU阈值分割的实现 来自淘豆网m.daumloan.com转载请标明出处.