|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
* b, J4 h3 u# T4 {3 v* S
一、简介
5 J- `+ e( @- K* x, L$ e% t- b
& m# g% |. d7 K: e$ V- \# w6 {, V- i2 ]7 x! N/ H
由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。
2 B% Q! g2 S( e. \% q% y. p# V$ s
参考文献: y. Z& y, i$ R
Y' m. N. h; B
[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址
# H9 C- p$ Y( w+ l8 V
; V; J7 v# i, |# r8 N算法思想:
( a) n) b9 ~/ S# L4 ^9 ]
& u& c f, B% T8 h6 L+ n- x假设一幅图像有L个灰度级[1,2,…,L]。灰度级为i的像素点的个数为ni,那么总的像素点个数就应该为N=n1+n2+…+nL。为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:
* }8 ]* M: N5 @9 N' n4 B$ G, P! N g! P; H+ c
" L1 x3 D2 H0 q; \3 r9 L2 G
' p9 p3 W) g0 I% p* f8 D- d- Q: j% K, h5 }% I
# j: c6 y! _4 f& `1 j( T" K0 |/ v( r" V
2 {' L' w' ?* K% j! R
# `8 k0 g; o; U% G6 ?+ t7 s
: U: f; X0 z: W, w1 A0 G
5 E" r1 L/ [+ a5 W- h2 c/ C8 f, X
" k5 C# K( }# h& _9 q* C$ R
二、源代码0 ]& o: e. u+ ?
1 B# h; J$ z [5 D7 S* w4 l6 N$ l- 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自带');
- 4 R9 k- D4 Q, D; U' M: q+ B
& g, s- h8 `6 C. e# l
5 q- }# w ^$ y; `8 y
o- t& p T% d; }7 k+ {三、运行结果; T4 l5 m) k, V/ F& i9 M1 d
) a, i2 F. k; {% o9 B, F5 D
" K; e) C" v% a! g1 {7 w
3 |6 L! c6 ] A9 w' Q" g6 p# j
- G. C" x1 h5 Q' P. V, O; [% E |
|