当前位置:首页 > 图像OTSU阈值分割的程序设计
武汉理工大学《专业综合课程设计》说明书
k?1i?0C0类像素所占的总面积的比例为:
?0??Pi
C1类像素所占的总面积的比例为:
?1?1??0
C0类像素的平均灰度级为: C1类像素的平均灰度级为:
?0??0(k)/? 0 ?1??1(k)/?1
L?1其中,
1 i 0
i?k?(k)??iP?1??(k)
则类间方差公式为:
?0(k)??iPii?0k?122?2(k)??(???)??(??? 0011)2令k从0~L-1变化,计算在不同k值下的类间方差?大值时的那个k值就是所要求的最优阈值。
(k),使得?2(k)最
3.4全局阈值
采用阈值确定边界的最简单做法是在整个图像中将灰度阈值的值设置为常数,也就是全局阈值。如果背景的灰度值在整个图像中可合理地看做恒定,而且所有物体与背景都具有几乎相同的对比度,那么,只要选择了正确的阈值,使用一个恒定的全局阈值一般会有较好的效果。
5
武汉理工大学《专业综合课程设计》说明书
4实验程序
根据题目要求,此程序根据OTSU原理,能完成求取阈值,并与用Matlab的库函数求得的阈值进行比较的功能。为了体现OTSU算法的优越性,更进一步用全局阈值法分割图片,来进行两种方法的对比。
function main %主程序
clear;close all; %清除变量,关闭所有窗口
[name path]=uigetfile('*.jpg');%获取图片路径及文件名 I=imread([path name]);%读图 I=rgb2gray(I);%彩色转黑白 while 1 %循环执行
disp('0 原图 1 OTSU 2 全局阈值');%提示信息 select=input('请选择:'); %选择相应功能 switch select case 0
yuantu(I); %输入0 显示原图
case 1 %输入1 OTSU法
fun1(I);
case 2 %输入2 全局阈值法 fun2(I);
otherwise %其他值不处理 end end
function yuantu(I) %显示原图 figure
imshow(I);title('原图')
6
武汉理工大学《专业综合课程设计》说明书
function fun1(I) %阈值计算程序 Ni=imhist(I);%计算直方图数组 N=sum(Ni); %总像素点个数 delamax=0; %类间方差最大值 threshold=0; %阈值 for k=2:255
u=dot([0:255],Ni/N); %图像的总平均灰度级 w0=sum(Ni(1:k)/N); à类像素所占面积的比例 w1=1-w0; á类像素所占面积的比例 if w0==0|w0==1 %当w0为1或0时提前结束本次循环 continue end
u0=dot([0:k-1],Ni(1:k)/N)/w0; à类像素的平均灰度 u1=dot([k:255],Ni(k+1:256)/N)/w1; á类像素的平均灰度 dela(k)=w0*(u-u0)^2+w1*(u-u1)^2; %类间方差公式
%求出类间方差的最大值,最大时的那个值对应的k值存入delamax if dela(k)>delamax delamax=dela(k); threshold=k-1; end end
BW1=im2bw(I,threshold/255); %阈值分割 figure
imshow(BW1),title('自编程序运行结果')%显示图片 disp('自编程序求的的阈值:')%显示提示信息 disp(threshold) %显示结果 %调用系统函数OTSU阈值分割
level=graythresh(I);%调用系统函数计算阈值 BW2=im2bw(I,level); %阈值分割
7
武汉理工大学《专业综合课程设计》说明书
figure
imshow(BW2),title('调用库函数运行结果') level=round(level*255); disp('调用库函数求得的阈值:') disp(level)
function fun2(I) %阈值分割程序 [width height]=size(I);;%获取图片宽高 th=input('请输入阈值:'); for i=1:width for j=1:height
if(I(i,j)
else % 灰度大于等于阈值时则为白色 BW1(i,j)=1; end end end figure
imshow(BW1),title('全局阈值')
8
共分享92篇相关文档