|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 A& M/ \' U% F+ V
一、简介. Y8 @3 S/ k9 w6 f% T7 |
6 [( p9 o! w8 T: {4 n0 n8 o2 R. Y$ V3 e: ?; D& {
由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。
S' T; T& P- R5 @8 s# f( Q6 W! I4 r7 G k) v
参考文献:
& [* e# s! e* X1 C/ H: D5 Z. j5 L4 t4 `- M
[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址
9 N9 @) J K. C7 R& K, P2 f" i4 J5 [8 o+ _* U
算法思想:% E; @6 Q6 t' L
; ]" {+ b; z4 j- n
假设一幅图像有L个灰度级[1,2,…,L]。灰度级为i的像素点的个数为ni,那么总的像素点个数就应该为N=n1+n2+…+nL。为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:
- `. I3 Y2 T2 o7 B& e& O9 ^! V5 j: [- J; Y
, l, U& v; E) K+ ?8 u1 O) t
" R6 n% D1 ]) N1 E$ H( a! N' ~$ K+ p3 E9 j
( N$ _3 Y2 L% `* Y% x0 \
4 V3 V6 S. G( d2 f0 w/ I) n' i
3 k0 ?- m" c% O8 R9 [7 k
) ^7 x1 [' }: ] x% ?# U
+ n$ |8 C3 ?( Q; v+ {# f
, V; k& Y) C, G, }! d7 S- y5 \& C
* L8 a) [" {% h二、源代码8 y1 H* r. o4 }8 o& {- E
) F3 P( M" w3 a1 a
- 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自带');
- & }# u b" n: J
, Y9 U) I+ X* O4 G5 c: Z) f5 g- U; n8 ^
. t \2 |8 G: V' u+ l5 s+ O
三、运行结果2 `- n7 G; E1 j7 h! L1 v
1 F t7 H4 B m9 V7 o7 k! H
9 W) I7 L2 {% F3 y ?
7 P/ N5 f7 N4 _
6 e9 l/ _$ \" @. o8 ? |
|