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