得鹿梦鱼 得鹿梦鱼

Otsu(大津法)

OTSU算法,又被称为最大类间方差法(大津算法),是一种确定阈值的算法,是由日本学者大津展之于1979 年提出的。该方法常用于图像进行二值分割时的自适应阈值计算

它是按图像的灰度分布特性,将图像分成背景background和目标object两部分。分割的依据是两类之间的间类方差最大,即类别内的差异最小化

原理

我们对一副标准化图像,例如把图像的像素值映射到0-255,我们想通过一个阈值 把图像像素值分为两类;
分别是类A小于γ\gamma和类B大于等于γ\gamma。那我们这个阈值取值于0-255,这里我们去阈值为整数,问题是我们怎样选取可以是的类A与类B之间的间类方差最大化。

如何表示这个间类方差

前提条件:图像的像素值范围在0-255之间,且为整数

统计每个灰度值的像素个数,设nin_i为图像中灰度为i的像素的总数量,则能得到n0,n1,,n255n_0,n_1,\cdots,n_{255}
图像中像素为ii的概率为Pi=nin0+n1++n255P_i=\frac{n_i}{n_0+n_1+\cdots+n_255}且满足公式0255Pi=1\sum^{255}_0P_i = 1

假设我们的阈值为tt已知,则我们可以确定类A与类B之间的方差
对于类A来说,有像素被分配到类A的概率为:PAt=0tPiP_At=\sum^t_0P_i
A类像素的平均像素灰度值为mAt=0tipiPAtm_At=\frac{\sum^t_0ip_i}{P_At}

对于类B来说,有像素被分配到类A的概率为:PBt=t+1255PiP_Bt=\sum^{255}_{t+1}P_i
B类像素的平均像素灰度值为mBt=t+1255ipiPBtm_Bt=\frac{\sum^{255}_{t+1}ip_i}{P_Bt}
且真个图像的像素的平均灰度值为mG=0255ipim_G=\sum^{255}_{0}ip_i

有上式可以得出
PAt+PBt=11式PAtmAt+PBtmBt=mG2式P_At + P_Bt = 1 \quad \text{1式}\\P_At * m_At + P_Bt * m_Bt = m_G \quad \text{2式}

且类A与类B的总体方差为

σ2=PAtmAtmG2+PBtmBtmG23式\sigma^2 = P_At * {m_At - m_G}^2 + P_Bt * {m_Bt - m_G}^2 \quad \text{3式}

将1式和2式带入3式中得出
σ2=PAtPBtmAtmBt2\sigma^2 = P_At * P_Bt * {m_At - m_Bt}^2

由此,我们将间类方差表示为分割阈值tt的函数,下面我们只需要求解t使得方差 最大即可,为此我们可以让tt遍历[0-255],找到使最大的tt

代码实现可参考