|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% v" a6 @5 @9 c/ f
一、简介/ I# m& z# I# K8 `! O1 H
! M1 ~+ n/ C8 O, U! r9 N: [/ x# K6 U, b6 I
由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。9 r6 l/ d: q: o1 d1 ]
- s' U5 u( k$ I参考文献:; G8 c+ Y F8 Q& ?4 ]
& G! n# K# F; T" T" C
[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址
: e% S! B7 J$ R$ p' @/ d k q# b |% [) _7 B6 i7 u, ]
算法思想:& m! |7 M! b1 U$ ]" s L. o
# c3 G6 {9 N# W: A: k+ I2 `
假设一幅图像有L个灰度级[1,2,…,L]。灰度级为i的像素点的个数为ni,那么总的像素点个数就应该为N=n1+n2+…+nL。为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:
6 E+ k. }4 P: g1 G8 H7 i
p* \$ z1 j0 h$ b
4 U# v. ~9 b+ L# Y# z( l& _
8 a5 [/ f" J, D t# P5 w% m1 K
) p4 x' R g7 I( l7 c
C- p+ }" y/ f0 Z2 s' _2 }. u+ f, o# D. y& m, p7 b& r
2 T( `, u: W+ f4 K* c, H( B
/ ?# i4 t7 q9 x9 l
6 H* k* f! _5 H
. E& [& w; X& [' u( O( e
) _* A# S, Y! ]) j
二、源代码$ S- _1 Z% m, f# Y6 h
' ^9 f5 |" W2 k
- clear
- close all
- clc
- I=imread('rice.png');
- [m,n]=size(I);
- N=m*n;
- L=256;
- for i=1:L
- count(i)=length(find(I==(i-1)));
- f(i)=count(i)/(N); %每个灰度对应的概率,i=1,对应灰度值为0(i-1)
- end
- for i=1:L
- if count(i)~=0
- st=i-1; %开始的灰度值
- break;
- end
- end
- for i=L:-1:1
- if count(i)~=0
- nd=i-1; %结束的灰度值
- break;
- end
- end
- p=st; q=nd-st+1;
- u=0;
- for i=1:q
- u=u+f(p+i)*(p+i-1); %u是像素的平均值
- ua(i)=u; %ua(i)是前i+p个像素的平均灰度值 (前p个无取值)
- end;
- for i=1:q
- w(i)=sum(f(1+p:i+p)); %w(i)是前i个像素的累加概率,对应公式中P0
- end;
- w=w+eps;
- %对照sigmaB的公式写出目标函数。实际是遍历所有值
- d=(w./(1-w)).*(ua./w-u).^2;
- [y,tp]=max(d); %可以取出数组的最大值及取最大值的点
- th=tp+p;
- figure;imshow(im2bw(I,th/255),[]); title('最大类间方差');
- %% matlab自带函数
- figure;imshow(im2bw(I,graythresh(I)),[]); title('matlab自带');
- 9 Q' T( k( ?: ~) S% V
- d% \9 q- b: V# @5 W' I |# c& K- s! x$ h
2 ~7 W# H: H- }$ f3 o% h8 k% d三、运行结果
. q# M; K" v" U5 S! k# W; C i; z/ r; o% w+ k1 b' Y
( e4 C# s+ l2 @4 p
2 x9 |) c9 X0 `4 T1 g7 U2 Q+ u6 Y. S k
2 M E; {( q3 L# @0 m" O% n
|
|