武汉理工大学《专业综合课程设计》
C0类像素所占的总面积的比例为:
?0??Pi (4)
i?0k?1 C1类像素所占的总面积的比例为:
?1?1??0 (5) C0类像素的平均灰度级为:
?0??0(k)/?0 (6) C1类像素的平均灰度级为:
?1??1(k)/?1 (7) 其中,
?0(k)??iPi (8)
i?0k?1 ?1(k)??iPi?1??0(k) (9)
i?kL?1 最大类间方差的公式为:
?2(k)??0(???0)2??1(???1)2 (10) 令k从0~L-1变化,计算在不同k值下的类间方差?2(k),使得?2(k)最大值时的那个k值就是所要求的最优阈值。
方法二:使用库函数的算法
在matlab工具箱提供的graythresh函数求取阈值采用的就是OTSU算法,使用库函数求取阈值就是调用graythresh函数选择阈值。
3
武汉理工大学《专业综合课程设计》
2 设计实现程序
依据本次课程设计的要求,在程序设计中,我用了非库函数和库函数两种方法进行图像的阈值求取,然后将图像进行人工选择不同阈值的阈值分割,以便进行对比。由于要实现的功能不止一个,程序比较复杂,所以为了方便程序的阅读与理解,我将程序进行分模块编写。具体程序如下:
function main %主程序
clear;close all; %清除变量,关闭所有窗口 [name path]=uigetfile('e\\dx1102.jpg'); %获取图片路径及文件名 I=imread([path name]); %读图 I=rgb2gray(I); %彩色转黑白 while 1 %循环执行
disp('0 原图 1 OTSU 2 全局阈值'); %显示功能提示信息 select=input('请选择:'); %选择相应功能 switch select
case 0 %输入0 显示原图 yuantu(I);
case 1 %输入1 OTSU法
fun1(I);
case 2 %输入2 全局阈值法 fun2(I);
otherwise %其他值不处理 end end
function yuantu(I) %显示原图 figure
imshow(I);title('原图')
function fun1(I) %阈值计算程序
4
武汉理工大学《专业综合课程设计》
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); %阈值分割 figure
5
武汉理工大学《专业综合课程设计》
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('全局阈值')
%获取图片宽高 %灰度小于阈值时则为黑色 % 灰度大于等于阈值时则为白色 6
相关推荐: