|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
7 @3 Y$ @! s: o# O0 O- R4 y' ?一、简介
S9 z ^* Y* ]; \' \: r; L& `- }$ V! Y3 W0 o' ^2 x* f) H" h
4 i4 T/ B9 j# ]8 I; o由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。
; \6 y( z( S4 f6 A+ `6 D! j) w
& P/ s$ r& M) }4 ]6 K3 ^参考文献:
# `3 @$ z9 Q5 C; ]6 a: u7 O" z y* U8 N) l/ T
[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址
8 M1 X' F( x) F0 k
# K M% Y: E) F7 V9 i算法思想:- ?1 @4 L: O2 z8 x; i
- n' B. d9 p% C& Z9 r2 p* Z: l假设一幅图像有L个灰度级[1,2,…,L]。灰度级为i的像素点的个数为ni,那么总的像素点个数就应该为N=n1+n2+…+nL。为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:
) Y$ t4 |4 G. U3 k9 L5 @
7 G& B+ G, k9 b4 s
1 X) f% I% H1 n3 z! r1 l
, B: h6 ~% X! l0 }
- z" r; z0 U6 y' e% M5 W! u
% v- R+ P2 D* V5 k
+ J+ E# z ]- s) H( n0 V
6 _( V. g r# ?3 }
. @# b; w1 e/ _
; Z( w# Q1 J U3 w" \! ?" J A/ ^6 T+ ?3 o. p8 V
# o) H" v1 E4 x0 k. h _! M+ g7 V
二、源代码5 j4 a" @. p% r
8 [( w$ ~% E6 b. u) p
- 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 }9 J8 z9 t
, q2 y! i4 M. I2 t8 R" [! v
$ O7 X5 `# }1 H+ ~! H6 b& v0 d! S2 N4 a
三、运行结果 n' U+ ]- T, v1 N" \1 U( K
. y* |0 V* _ c1 R& R; G
7 y0 j, a8 ?" `% m
T3 O5 c. w; i( a' E' Z4 a
; _( x) j4 g6 S8 q1 A9 { z |
|