大津法(OTSU)进行阈值分割——学习笔记2
OTSU原理
大津法常用于图像的阈值分割,通过搜寻目标与背景之间的最大方差来自适应地确定图像分割的最佳阈值。
对于一个一维干涉信号,首先对信号进行归一化,将信号减去直流部分,然后对信号取绝对值(或平方或四次方),得到类似灰度直方图。假设该信号共有N个数据点,每个数据点值的大小为N(i),则每个数据点值的总和为sum(N),每个数据点占总体的概率为pi=N(i)/sum(N),将处理后的信号分为A、B两部分,则各部分占总体的概率为:
wa=∑i=1tpi wb=∑i=t+1Npi
\ w_a=\sum_{i=1}^{t}p_i\, \\\ w_b=\sum_{i=t+1}^Np_i\,
wa=i=1∑tpi wb=i=t+1∑Npi
A和B中各点所占的概率分别为:
pi/wa (i=1,2,,3,4……t) ,pi/wb (i=t+1,t+2,……N)
\ p_i/w_a\, \ (i=1,2,,3,4……t)\ ,\\\\\\p_i/w_b\, \ (i=t+1,t+2,……N)
pi/wa (i=1,2,,3,4……t) ,pi/wb (i=t+1,t+2,……N)
信号总体(所有数据点)的数学期望可表示为:
E=∑i=1Npi∗i
\ E=\sum_{i=1}^{N}p_i*i\,
E=i=1∑Npi∗i
A、B两部分各自的数学期望大小为:
ua=∑i=1tpi∗i/wa , ub=∑i=t+1Npi∗i/wb
\ u_a=\sum_{i=1}^{t}p_i*i/w_a\,\ ,\ u_b=\sum_{i=t+1}^{N}p_i*i/w_b\;
ua=i=1∑tpi∗i/wa , ub=i=t+1∑Npi∗i/wb
则该信号的类间方差为:
δ12=wa(ua−E)2+wb(ub−E)2
\delta_{1}^{2}=w_a(u_a-E)^2+w_b(u_b-E)^2\,
δ12=wa(ua−E)2+wb(ub−E)2
j假设A、B相互独立时,其各自的方差为:
δa2=∑i=1t(pi/wa)∗(i−ua)2 , δb2=∑i=t+1N(pi/wb)∗(i−ub)2
\delta_{a}^{2}=\sum_{i=1}^{t}(p_i/w_a)*(i-u_a)^2\,\, ,\ \delta_{b}^{2}=\sum_{i=t+1}^{N}(p_i/w_b)*(i-u_b)^2\,
δa2=i=1∑t(pi/wa)∗(i−ua)2, δb2=i=t+1∑N(pi/wb)∗(i−ub)2
则该信号的类内方差为:
δ22=wa∗δa2+wb∗δb2
\delta_{2}^2=w_a*\delta_a^2+w_b*\delta_b^2\,
δ22=wa∗δa2+wb∗δb2
则理想的分割阈值位于类间方差最大、类内方差最小的位置。
信号处理
原始信号(含有两个包络)

对该信号进行预处理,减去直流项,然后取平方,得到类似直方图的新的信号形式:
I_signal=I_signal-mean(I_signal);
I_gray=I_signal.^2;
figure,plot(scanstep,I_gray,'linewidth',2.5),title('将原始信号处理成类似灰度直方图形式');

对新的信号采用大津法进行阈值分割,得到分割点:
代码如下:
[M,N]=size(I_gray);
total=sum(I_gray,2);
%总体期望
E=0;
for i=1:N
E=E+(i*I_gray(i))/total;
end
otsu1=zeros(1,N);
otsu2=zeros(1,N);
J=zeros(1,N);
for t=1:N
wa=0;wb=0;
ua=0;ub=0;
sigma_A=0;sigma_B=0;
A=zeros(1,N);
B=zeros(1,N);
%分为A、B两部分
for i=1:t
A(1,i)=I_gray(1,i);
wa=wa+I_gray(i)./total;
end
for j=t+1:N
B(j)=I_gray(j);
wb=wb+I_gray(j)./total;
end
for i1=1:t
ua=ua+((I_gray(i1)/total)./wa)*i1;
end
for j1=t+1:N
ub=ub+((I_gray(j1)/total)./wb)*j1;
end
for i2=1:t
sigma_A=sigma_A+((I_gray(i2)/total)/wa).*(i2-ua).^2;
end
for j2=t+1:N
sigma_B=sigma_B+((I_gray(j2)/total)/wb).*(j2-ub).^2;
end
otsu1(1,t)=wa*(ua-E).^2+wb*(ub-E).^2;
otsu2(1,t)=wa.*sigma_A.^2+wb.*sigma_B.^2;
J(1,t)=1+2*(wa.*log(sigma_A)+wb.*log(sigma_B))-2*(wa.*log(wa)+wb.*log(wb));
end
得到结果:
[value_max_Otsu1,index_max_Otsu1]=max(Otsu1) %otsu最大/最小值对应坐标位置
[value_min_Otsu2,index_min_Otsu2]=min(Otsu2)

即在数据点58处(横坐标值58)取得阈值分割点,如下图,在x=58处类间方差取最大值,在x=58处类内方差取最小值:


同理,OTSU算法同样可以扩展到三峰信号(含三个包络)的阈值分割,假设将信号分为三个部分,则目标方程为:
δb2=w0(u0−uT)2+w1(u1−uT)2+w2(u2−uT)2
\delta_b^2=w_0(u_0-u_T)^2+w_1(u_1-u_T)^2+w_2(u_2-u_T)^2
δb2=w0(u0−uT)2+w1(u1−uT)2+w2(u2−uT)2
[1]马龙. 白光扫描干涉测量方法与系统的研究[D].天津大学,2011.
这篇博客介绍了如何利用大津法(OTSU)进行一维信号的阈值分割,重点讲解了OTSU的原理,并通过一个含有两个包络的原始信号例子,展示了信号预处理、计算类间方差和类内方差的过程,最终确定最佳分割点。
1万+

被折叠的 条评论
为什么被折叠?



