|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
" J% w8 ~) Q9 Y, ~# g! f一、简介
+ X f; R% t( ]* r, E2 y5 |; o6 b( @( O
6 J( o- \! Q) _- `' q1 X
由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。* d& K4 j! ~0 i! B6 [
& o- q; @& f: v" p参考文献:+ V! [$ ~9 L& O# x' r% J6 J% M
) Y% q! J+ I5 t! k[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址
" U0 a9 o( }+ [, C: \. {
) B8 Z( i. ], s/ q7 r算法思想:
O0 C6 ]# b3 F3 o. B0 t
4 O3 _( R9 g; Z9 o6 b' X假设一幅图像有L个灰度级[1,2,…,L]。灰度级为i的像素点的个数为ni,那么总的像素点个数就应该为N=n1+n2+…+nL。为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:
+ R! f9 q7 W1 _" c9 ~5 `' }3 Y7 S2 B
: ~, j, x3 H* C
) m/ y* W/ ?6 q
- M6 j, ~1 m4 {1 W0 \3 g% j
0 E- {& V) P! n K7 { @
X7 A& @7 B1 U
) ]+ Z+ I0 o7 A
8 H! \6 f; K# k
4 F/ Q l5 K5 M J" j
# I/ M, ~" k* H u
! l1 Y/ `4 |, e, y- ]
" _+ m* c/ v1 g5 M; m7 L- i5 h9 b二、源代码/ W% J, f6 |; E, N& u6 j' r, |
( m+ b% ?) S5 ]4 J5 V& @ m# X6 u- 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自带');
/ W* G; E; r. t; [ $ O4 y, M+ y" B% S [% |
/ k2 J7 e; ?" e5 J
7 `" I, k& ]1 X& n, d0 I8 F三、运行结果2 g3 r, P2 H7 F' q
/ D+ n) Z7 ~+ D) P. }" m- q
0 E+ s6 b( K: S# f: X' K# y$ N1 z/ ]
' H) M) r8 \1 A: @& @" \ |
|