最大类间方差法(OTSU大津法)
大津算法,也被称作最大类间方差法,是一种可以自动确定二值化中阈值的算法。
从类内方差和类间方差的比值计算得来:
小于阈值ttt的类记作000,大于阈值ttt的类记作111;
w0w_0w0和w1w_1w1是被阈值ttt分开的两个类中的像素数占总像素数的比率(满足w0+w1=1w_0+w_1=1w0+w1=1);
S02{S_0}^2S02, S12{S_1}^2S12是这两个类中像素值的方差;
M0M_0M0,M1M_1M1是这两个类的像素值的平均值;
即:
类内方差:Sw2=w0 S02+w1 S12{S_w}^2=w_0\ {S_0}^2+w_1\ {S_1}^2Sw2=w0 S02+w1 S12
类间方差:Sb2=w0 (M0−Mt)2+w1 (M1−Mt)2=w0 w1 (M0−M1)2{S_b}^2 = w_0 \ (M_0 - M_t)^2 + w_1\ (M_1 - M_t)^2 = w_0\ w_1\ (M_0 - M_1) ^2Sb2=w0 (M0−Mt)2+w1 (M1−Mt)2=w0 w1 (M0−M1)2
图像所有像素的方差:St2=Sw2+Sb2=常数{S_t}^2 = {S_w}^2 + {S_b}^2 = \text{常数}St2=Sw2+Sb2=常数
为了评价(灰度级k)这个门限“好”的程度,我们需要引入判别式分析中使用的判别式标准来测量(类的分离性测量)我们用以下的式子计算分离度XXX:
X=Sb2Sw2=Sb2St2−Sb2 X = \frac{{S_b}^2}{{S_w}^2} = \frac{{S_b}^2}{{S_t}^2 - {S_b}^2} X=Sw2Sb2=St2−Sb2Sb2
也就是说: argmaxt X=argmaxt Sb2 \arg\max\limits_{t}\ X=\arg\max\limits_{t}\ {S_b}^2 argtmax X=argtmax Sb2 换言之,如果使Sb2=w0 w1 (M0−M1)2{S_b}^2={w_0}\ {w_1}\ (M_0 - M_1)^2Sb2=w0 w1 (M0−M1)2最大,就可以得到最好的二值化阈值ttt
实现思路
- 计算0~255各灰阶对应的像素个数,保存至一个数组中,该数组下标是灰度值,保存内容是当前灰度值对应像素数
- 计算背景图像的平均灰度、背景图像像素数所占比例
- 计算前景图像的平均灰度、前景图像像素数所占比例
- 遍历0~255各灰阶,计算并寻找类间方差极大值