图像二值化的方法有很多,但是由于MATLAB中的图像二值化就是采用的OTSU方法,那在某种程度上证明了这种算法的优秀,所以我也准备采用这种方法来进行图像二值化。
首先来看OTSU论文中的关于公式的介绍部分
限于个人英文阅读能力有限,但是根据文献中的
可以得出最佳阈值是当σ²B()最大的时候的k。
也可以看到σ²B的计算公式是
其中W0,W1,μ0,μ1,μT的计算公式如下
在这里面的Pi即为每个灰度值出现的概率
公式都已经解析完了,接下来就是通过代码来实现原理了
MATLAB实现的代码如下:
OTSU=0;
OTSU0=0;
OTSU_t0=0;
Gray_p=zeros(1,255);
su=sum(Line);%计算出灰度的总和
for i=1:255
Gray_p(i)=Line(i)/su;%计算出每一个灰度值在图像中出现的概率,对应公式中的P(i)
end
for i=1:255
Foward_p=sum(Gray_p(1:i));
%计算前景的灰度概率和,对应公式中的W0
Back_p=sum(Gray_p(i+1:255));
%计算后景的灰度概率和,对应公式中的W1
Omega_f=sum((1:i).*Gray_p(1:i))/Foward_p;
%计算出前景的平均灰度,对应公式中的μ0
Omega_b=sum((i+1:255).*Gray_p(i+1:255))/Back_p;
%计算出后景的平均灰度,对应公式中的μ1
Omega=Foward_p*Omega_f+Back_p*Omega_b;
%计算出整幅图像的平均灰度对应公式中的μT
OTSU0=(Omega_f-Omega)^2*Foward_p+(Omega_b-Omega)^2*Back_p;
%计算出前景和背景的方差,对应公式中的μB
if OTSU<OTSU0
OTSU=OTSU0;%一旦找到更大的方差即更新
OTSU_t0=i;%找到公式中的K*,即最佳阈值
end
end
最后的效果如下: