|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
/ E0 {* ]; ?- D! ^一、简介
- D8 ]# K3 H% h( S1 M2 b& U3 [: ~$ t
" k Z# I) m6 K! g+ E& O+ V; {3 h% V9 o* P# W' d. t# `
由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。& F, E6 C0 z% I) p, s9 Q+ ?
7 m7 L( U% H0 {/ B1 I
参考文献:
! `0 i j; m) l9 t! V u8 b7 Q Q4 h
[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址" R! m' ?5 Z5 E1 ?& V$ R
, M: F7 n7 |* J# W' f算法思想:0 q5 x6 Z7 o3 O* ^6 A2 M
5 v" }$ g9 Y7 `! k
假设一幅图像有L个灰度级[1,2,…,L]。灰度级为i的像素点的个数为ni,那么总的像素点个数就应该为N=n1+n2+…+nL。为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:
% ]2 e) X% k. U; H/ e
( Y6 H, X5 [: t7 h& p
; M. B- f5 _& S3 f; N; j/ X: R0 {# p6 v
8 S) d3 Z$ {! }* y- Q/ _% K7 K! B- R2 {+ s# P b
$ h3 a1 F6 n# c3 ]+ \ G+ Z0 v, h6 t9 [+ B G3 Y7 g+ ] k0 G z
; T8 K% r0 \& R
" S4 ?' U, w8 `5 R7 O
n' O2 m2 Z5 N
2 S0 V" ]% I: }- `! W# T" [- Y3 e
二、源代码# [- d$ r8 g6 ~- [
+ C* S0 I X5 C1 @2 z! q% 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自带');
- 8 t* ~2 j+ g* W0 J n( y1 N
- V' p. x+ M/ g
9 G4 y- _9 X* F" x
7 h. p: `* Z' ~& @$ B1 t三、运行结果
1 P7 b& H/ Z6 C% D$ N3 P, i. _
4 P( o" D( f: I% Q# m% W
1 k4 t5 O n- H, n3 n# n# B
3 D/ t' S1 P, B
+ y1 L- W1 r3 a0 N' { |
|