|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
* }& N0 o% G$ q* {0 x* z D% ?7 E一、简介
% w% e# w$ o& G, {9 s) r* G- Z5 u, O2 {- g6 Q
" S8 c8 S; y, Q0 d) f8 n, _由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。
9 q( ] B/ \/ @( c( o0 `" ^6 e* ^5 {
参考文献:- S' p- x' _7 y
% U: b. S! B; b- Q5 |0 q[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址6 U- O6 o' D" n) ?
) z9 C- l3 r8 }: V9 d5 |+ {算法思想:
) C4 V, s0 ?; ^- U% S$ Y$ ^' J4 q& e* C$ N' g
假设一幅图像有L个灰度级[1,2,…,L]。灰度级为i的像素点的个数为ni,那么总的像素点个数就应该为N=n1+n2+…+nL。为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:; v j- {' o" `. V1 u- M) a
, ]( C7 f% w1 U6 n+ }
: _3 B3 A% B, h H( v' i6 Q
5 O! r1 |8 X0 N5 _
1 F8 B; N. K) m U# f9 S
; o: f( b! n' }: f9 K
$ @* t; V) I* @. b* c r
- G7 Y9 U! @. I0 Y7 B
; {% B U/ Y9 o, `
+ f" C5 [- L9 }8 ]% r/ B" t4 P4 e: A) D' u2 p+ V$ o4 P
; x* w, U! i7 y4 t
二、源代码
5 q' R9 ^3 P3 o- k; U & a* ^9 P& f: f" a, K: l+ B- z; m1 T
- 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自带');
! z8 P" I a7 l9 j" y5 b / n' F& u% h( v8 U
' e! B7 \% Q3 q5 Z$ i0 a6 z' o, ]. v2 f
三、运行结果# g; F' d9 h" S" p! P1 B
. o% ]6 D5 D( C9 c" H) F! Q! Y
% S8 s8 \3 _. P: \2 ~% L# v
! Q% [& z6 `' O
7 ]5 D |( ]2 y( ^0 S
|
|