|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$ ^: {6 h. E6 L, z6 n5 o一、简介
* B. j3 M6 }6 z; V' J- r6 ~# x! |) w' n& U* L1 m: x* L D. V
/ d, \* {3 W' F3 ?- J. Q( F/ q4 E
由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。 {0 t M1 \/ Q. b
( D' Z# U1 Y' B) u4 c参考文献:
7 Q6 X0 L0 m8 O- o
9 c1 f/ c6 K; i+ l; u% w3 Y[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址' X8 Y. `2 r- q
: h' c6 d' A$ U, E; y
算法思想:
3 ^. c. I. g: B9 v. n
3 m( M& f K: g5 `0 \假设一幅图像有L个灰度级[1,2,…,L]。灰度级为i的像素点的个数为ni,那么总的像素点个数就应该为N=n1+n2+…+nL。为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:
4 G: d$ S9 W% Z0 j: ]9 P
0 K+ Q+ }3 }1 @3 k9 v8 `
: N1 p- l/ I$ e5 E. q7 X
H2 s+ j- z; ^/ Y% @# p
& o' S7 P$ g1 `
2 O+ g | M0 d P8 ~9 d, ^9 r1 {4 e6 |6 a; W! b! |4 b/ m+ R
! D: ^6 ~8 @) u0 E! l# u2 ~+ N1 P E, u* D
: t. A. O# |2 C5 z7 E5 ?' X; Y
$ \! X9 _( z2 A- q) P+ K二、源代码3 K) p' S7 H* b0 Z! v4 w/ _9 v
+ \6 A# @- J3 N$ @8 U6 w* q9 J
- 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自带');
- * H+ m* j5 }1 ^! ~! R/ X( i- ]
+ R! [5 J6 v M+ B
0 H) H- h1 r& `" o: j: v! m$ i/ a- P/ K0 P3 F9 P" o8 H* ] i* [
三、运行结果
. C. ^4 j6 v; p' i# T. |( T+ F6 x" n0 g8 P$ j3 z ?
) C( b1 q9 q- U, ~
. M8 r+ N+ Q5 O$ r( o7 ~% Q7 q
0 n2 P2 v* G7 F" l
|
|