大津法(OTSU 最大类间方差法)详细数学推导(公式繁杂,欢迎讨论)

大家新年快乐哇, 武汉加油,我的家乡温州也加油,中国加油!向前线人员致敬!


最近在家里做迁移学习,受限于笔记本的限制,深度方向做不了,开始看师兄的论文,发现论文里提到最大方差法,但是没有具体说明出处,去查找相应的出处,也就看到了大津算法,但很奇怪的是,好多人都是很简略地说了思想,到底怎么出来的,还是没明白,因此自己找呗~

将进行一个阈值即两类的推导,让思想动起来!


大津算法提出了两个方差(若有人知道更早的出处欢迎留言指出)。
1.within-class variance 类内方差
2.between-class variance 类间方差

提前指出结论

1.大津法的目标就是最大化类间方差
2.实现最大化类间方差同时就实现了类内方差最小化,因为二者的平方和为定值
3.最优阈值点一定存在

具体程序就麻烦小伙伴自己找找啦。

~~ 进入正题 ~~

现在有一张灰度图含有背景图像和目标图像(C0,C1C_0, C_1),我们要找到一个阈值将像素值分为两块使两者最好的区分。
来源于网络

图来源于网络,右图类间差异大,区分明显。所以最大化类间差异

现在再来看看公式推导

将图片的像素值分为 [1, 2, …, L] 个水平,用nin_i表示各个水平像素值的像素个数,那么很容易得到总像素个数为

N=n1+n2+...+nL N = n_1 + n_2 + ... + n_L

我们利用像素值对应个数与总数的商作为某个像素值出现的概率,定义pip_i

pi=ni/Ni,pi0,i=1Lpi=1 p_i = n_i / N_i, p_i \ge0, \sum_{i=1}^L p_i=1

定义两个量w0,w1w_0, w_1C0,C1C_0, C_1的局部概率之和,并且得到二者的关系

w0=Pr(C0)=i=1kpi=w(k) w_0 = Pr(C_0) = \sum_{i=1}^k p_i = w(k)

w1=Pr(C1)=i=k+1Lpi=1w(k) w_1 = Pr(C_1) = \sum_{i=k+1}^L p_i = 1-w(k)

由此我们得到总的数学期望和C0,C1C_0, C_1各自的数学期望并指出三者的关系,式中ii代表像素值,除于各自概率的和用于进行归一。

uT=u(L)=i=1Lipi u_T = u(L) = \sum_{i=1}^L i*p_i

u0=i=1kiPr(iC0)=i=1kipi/w0=u(k)w(k) u_0 = \sum_{i=1}^k i*Pr(i|C_0)=\sum_{i=1}^k i*p_i/w_0 = \dfrac{u(k)}{w(k)}

u1=i=k+1LiPr(iC1)=i=k+1Lipi/w1=uTu(k)1w(k) u_1 = \sum_{i=k+1}^L i*Pr(i|C_1)=\sum_{i=k+1}^L i*p_i/w_1 = \dfrac{u_T - u(k)}{1-w(k)}

并指出以上公式之间的关系:

w0u0+w1u1=uT       w0+w1=1 w_0u_0+w_1u_1 = u_T \space \space \space \space \space \space \space w_0+w_1 = 1

除了数学期望,计算各自局部方差和总方差

σT2=i=1L(iuT)2pi \sigma_T^2=\sum_{i=1}^L (i-u_T)^2p_i

σ02=i=1k(iu0)2Pr(iC0)=i=1k(iu0)2pi/w0 \sigma_0^2=\sum_{i=1}^k (i-u_0)^2Pr(i|C_0)=\sum_{i=1}^k (i-u_0)^2p_i/w_0

σ01=i=k+1L(iu1)2Pr(iC1)=i=k+1L(iu1)2pi/w0 \sigma_0^1=\sum_{i=k+1}^L (i-u_1)^2Pr(i|C_1)=\sum_{i=k+1}^L (i-u_1)^2p_i/w_0

基础打完,为了大家翻遍查阅,列一个表格方便查阅

变量/公式 相关含义
pip_i 某个像素值可能出现的概率
w0/w(k),w1w_0/w(k), w_1 C0,C1C_0, C_1 对应的概率和
uT,u0,u1u_T, u_0, u_1 整个图像,C0C_0C1C_1,像素的数学期望
σT,σ0,σ1\sigma_T,\sigma_0,\sigma_1 整个图像,C0C_0C1C_1,像素的方差
ipi\sum i*p_i 数学期望的求解公式
(iu)2pi\sum (i-u)^2*p_i 方差的求解公式

定义完以上变量,作者提出
within_class variance 类内差异

σw2=w0σ02+w1σ12\sigma_w^2=w_0\sigma_0^2+w_1\sigma_1^2

between_class variance 类间差异

σb2=w0(u0uT)2+w1(u1uT)2\sigma_b^2=w_0(u_0-u_T)^2+w_1(u_1-u_T)^2

之前指出,作者要求最大化类间差异,我们可以从图中明白这个道理,那么为什么最大化类间差异就是最小化类内差异?

有意思的来了, 因为二者的和为定值

σw2+σb2=σT2 \sigma_w^2 + \sigma_b^2 = \sigma_T^2

以下为推导公式

我们取σw2\sigma_w^2σb2\sigma_b^2中的w0σ02w_0\sigma_0^2w0(u0uT)2w_0(u_0-u_T)^2两项,先将w0σ02w_0\sigma_0^2展开

 =w0[1w0i=0k(iu0)2pi]=w0[1w0i=0k((iuT)+(uTu0))2pi] \space =w_0[\frac1w_0*\sum_{i=0}^k(i-u_0)^2p_i]=w_0[\frac1w_0*\sum_{i=0}^k((i-u_T)+(u_T-u_0))^2p_i]

 =w0[1w0i=0k((iuT)2+2(iuT)(uTu0)+(uTu0)2)pi] \space =w_0[\frac1w_0*\sum_{i=0}^k((i-u_T)^2+2(i-u_T)(u_T-u_0)+(u_T-u_0)^2)p_i]

 =i=0k(iuT)2pi \space =\sum_{i=0}^k(i-u_T)^2 *p_i

+i=0k2(iuT)(uTu0)pi +\sum_{i=0}^k2(i-u_T)(u_T-u_0)*p_i

+(uTu0)2i=0kpi +(u_T-u_0)^2*\sum_{i=0}^kp_i

展开i=0k2(iuT)(uTu0)pi\sum_{i=0}^k2(i-u_T)(u_T-u_0)*p_i

=2(uTu0)i=0k(iuT)pi =2(u_T-u_0)\sum_{i=0}^k(i-u_T)p_i

 =2(uTu0)[i=0kipi+uTi=0kpi] \space =2(u_T-u_0)[\sum_{i=0}^kip_i+u_T\sum_{i=0}^kp_i]

根据数学期望和局部概率和的定义得到

i=0k2(iuT)(uTu0)pi=2(uTu0)w0(u0uT)=2w0(uTu0)2 \sum_{i=0}^k2(i-u_T)(u_T-u_0)*p_i = 2(u_T-u_0)w_0(u_0-u_T)=-2w_0(u_T-u_0)^2

w0σ02w_0\sigma_0^2化简为

 =i=0k(iuT)2piw0(uTu0)2 \space =\sum_{i=0}^k(i-u_T)^2 *p_i-w_0(u_T-u_0)^2

σb2\sigma_b^2的第一项可以发现,二者的和恰为
i=0k(iuT)2pi\sum_{i=0}^k(i-u_T)^2 *p_i

同理推得第二项,则

σb2+σw2=i=0k(iuT)2pi+i=k+1L(iuT)2pi=i=0L(iuT)2pi=σT2 \sigma_b^2+\sigma_w^2 = \sum_{i=0}^k(i-u_T)^2 p_i + \sum_{i=k+1}^L(i-u_T)^2 p_i=\sum_{i=0}^L(i-u_T)^2 p_i = \sigma_T^2

因此类内差异与类间差异的和为总的方差,为一定值

那么为什么最优阈值一定存在呢?

σb2\sigma_b^2的定义出发
已知

w0u0+w1u1=uT w_0u_0+w_1u_1 = u_T

因此

σb2=w0(u0uT)2+w1(u1uT)2 \sigma_b^2=w_0(u_0-u_T)^2+w_1(u_1-u_T)^2

 =w0(u0(w0u0+w1u1))2+w1(u1(w0u0+w1u1))2 \space =w_0(u_0-(w_0u_0+w_1u_1))^2+w_1(u_1-(w_0u_0+w_1u_1))^2

 =w0w1(u1u0)2 \space =w_0w_1(u_1-u_0)^2

再根据

u0=u(k)w(k)    u1=uTu(k)1w(k) u_0 = \dfrac{u(k)}{w(k)} \space \space \space \space u_1=\dfrac{u_T - u(k)}{1-w(k)}

σb2=[uTw(k)u(k)]2w(k)[1w(k)] \sigma_b^2=\dfrac{[u_Tw(k)-u(k)]^2}{w(k)[1-w(k)]}

求解最大类间差异可写作

σb2(k)=max1k<Lσb2(k) \sigma_b^2(k^*)=\max_{1\le k<L}\sigma_b^2(k^)

由上述σb2\sigma_b^2的分母可以发现,w(k)w(k)可以取到1也可以取到0,因此在边界上σb2\sigma_b^2可以无穷大,而在开集(0,1)(0,1)则类间方差有限,因此在定义域

S=k:w0w1=w(k)[1w(k)]>0 S^* = {k:w_0w_1=w(k)[1-w(k)]>0}

总存在最优解。

完成三条结论的推导


等等~

会不会有小伙伴在想
max1k<Lσb2(k)\max_{1\le k<L}\sigma_b^2(k^)

这个问题怎么解哇!

哈哈,我也不会,目前就是一个点一个点的代入哇,找到最大值即可。但是我最近在学凸优化这门课,相信自己学完是能解决这个的!

一起加油!

元宵快乐,芝麻汤圆最好吃了!


发布了8 篇原创文章 · 获赞 8 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章