算法001:大津法OTSU学习记录

OTSU算法
一、大津法主要的工作是什么?
  • 大多数时候,我们需要获取到一幅图像中的特定目标。如果可以根据像素值将图像进行合理的分割,例如全局阈值分割那样,找到一个阈值 T T T,大于阈值 T T T的赋予一个像素值,小于阈值 T T T的赋予一个像素值,那么就可以很容易的将目标与背景分离开来,如下公式所述:

g ( x , y ) = { 1 , f ( x , y ) > T 0 , f ( x , y ) ≤ T g(x,y) = \begin{cases} 1, f(x,y) > T\\ 0, f(x,y) \leq T\\ \end{cases} g(x,y)={1,f(x,y)>T0,f(x,y)T

​ 如上所示:当 T T T是一个适用于整幅图像的常数时, 该处理方式为全局阈值分割

  • 在此基础上,出现了用OTSU方法实现的最佳全局阈值处理,通过该算法,可以找到最佳的全局阈值
  • 总结起来: OTSU大津法是一个可以找到一幅图像的最佳全局阈值 T T T的算法
二、使用算法的时候我们想要达到什么目的?如何才能说明求得阈值就是最佳阈值呢?
  • 我们知道,经过阈值处理之后的图像其实是经过分类的,以某个阈值作为分类的**“分界点”**,理论上来讲,如果这个阈值足够好,那么像素被分成两组或者多组的过程中所引入的平均误差最小;从另一个角度来看,这两个组的平均灰度应该相差越大越好。

  • OTSU算法引入了类间方差的概念,然后当类间方差取到最大的时候,两个组的平均灰度相差最大,此时的阈值就是最佳阈值

  • 总结起来:
    目的就是可以是分成的两个类之间的差距尽可能的大,然后这个差距具体表现在平均灰度

    最佳阈值就是可以让更好的让我们达成上述目的的阈值

三、推导过程

1.假设一幅大小为 M × N M\times N M×N像素的图像,共有 L L L个不同的灰度级,因此其灰度区间可以表示为 [ 0 , ⋯   , L − 1 ] [0,\cdots,L-1] [0,,L1] n i n_i ni表示灰度级为 i i i的像素的个数,那么就有:
M N = n 0 + n 1 + n 2 + ⋯ + n L − 1 MN = n_0+n_1+n_2+\cdots+n_{L-1} MN=n0+n1+n2++nL1

像素为 i i i出现的概率约等于频率 p i = n i M N p_i =\frac {n_i}{MN} pi=MNni,于是可得:

∑ i = 0 L − 1 p i = 1 , p i ≥ 0 \sum_{i=0}^{L-1} {p_i} = 1, p_i\geq0 i=0L1pi=1,pi0
2. 如果先假定一个阈值 T ( k ) = k , 0 < k < L − 1 T(k) = k,0<k<L-1 T(k)=k,0<k<L1,他会将图像阈值分割为 C 1 C_1 C1 C 2 C_2 C2两类,其中 C 1 C_1 C1中的像素位于区间 [ 0 , k ] [0,k] [0,k], C 2 C_2 C2中的像素位于 [ k + 1 , L − 1 ] [k+1,L-1] [k+1,L1].

那么像素被分到类 C 1 C_1 C1中的概率为:

P 1 ( k ) = p 0 + p 1 + p 2 + ⋯ + p k = ∑ i = 0 k p i P_1(k) = p_0 + p_1 + p_2+\cdots +p_k =\sum_{i = 0}^{k} {p_i} P1(k)=p0+p1+p2++pk=i=0kpi

​同理,像素被分到类 C 2 C_2 C2中的概率为:

P 2 ( k ) = p k + 1 + p k + 2 + p k + 3 + ⋯ + p L − 1 = ∑ i = k + 1 L − 1 p i P_2(k) = p_{k+1} + p_{k+2} + p_{k+3} +\cdots +p_{L-1} =\sum_{i = k+1}^{L-1} {p_i} P2(k)=pk+1+pk+2+pk+3++pL1=i=k+1L1pi

​ 很显然:

P 1 ( k ) + P 2 ( k ) = p 0 + p 1 + p 2 + ⋯ + p k + p k + 1 + p k + 2 + p k + 3 + ⋯ + p L − 1 = ∑ i = 0 k p i + ∑ i = k + 1 L − 1 p i = ∑ i = 0 L − 1 p i = 1 P_1(k)+P_2(k) =p_0 + p_1 + p_2+\cdots +p_k+p_{k+1} + p_{k+2} + p_{k+3} +\cdots +p_{L-1} =\sum_{i = 0}^{k} {p_i}+\sum_{i = k+1}^{L-1} {p_i}=\sum_{i= 0}^{L-1}p_i = 1 P1(k)+P2(k)=p0+p1+p2++pk+pk+1+pk+2+pk+3++pL1=i=0kpi+i=k+1L1pi=i=0L1pi=1

​ 简言之:

P 1 ( k ) + P 2 ( k ) = 1 P_1(k) + P_2(k) = 1 P1(k)+P2(k)=1


​ 3. 在继续下面的推导之前,先引入下面的公式和概念(下述的是定义,当然也比较好理解

​ 某幅图像的平均灰度 m m m
m = ∑ i = 0 L − 1 r i p r i m = \sum_{i = 0}^{L-1}r_i p_{r_i} m=i=0L1ripri
​ 如果这里的知识遗忘的话,可以回忆一下考研概论中的期望简述如下:
E ( x ) = { ∑ x p ( x ) ,            离散情况 ∫ x f ( x ) d x ,        连续情况 E(x) = \begin{cases} \sum_{}^{} {xp(x)},\,\,\,\,\,\,\,\,\,\,\text{离散情况}\\ \int{xf(x)}dx,\,\,\,\,\,\,\text{连续情况}\\ \end{cases} E(x)={xp(x),离散情况xf(x)dx,连续情况
​ 某幅图像的灰度方差 σ 2 \sigma^2 σ2(二阶矩),也可以记为 μ 2 ( r ) \mu_2(r) μ2(r)
μ 2 ( r ) = ∑ i = 0 L − 1 ( r i − m ) 2 p i \mu_2(r) = \sum_{i= 0}^{L-1}{(r_i-m)^2p_i} μ2(r)=i=0L1(rim)2pi
​ 其中 r r r是像素值。


4.分到类 C 1 C_1 C1中像素的平均灰度值为:
m 1 ( k ) = ∑ i = 0 k i p ( i ∣ C 1 ) m_1(k) = \sum_{i = 0}^{k}{ip(i|C_1)} m1(k)=i=0kip(iC1)
由贝叶斯公式:
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) = \frac {P(B|A)P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

得到:
m 1 ( k ) = ∑ i = 0 k i P ( i ∣ C 1 ) = ∑ i = 0 k i P ( C 1 ∣ i ) P ( i ) P ( C 1 ) m_1(k) = \sum_{i = 0}^{k}{iP(i|C_1)} =\sum_{i=0}^{k}{i\frac {P(C_1|i)P(i)}{P(C_1)}} m1(k)=i=0kiP(iC1)=i=0kiP(C1)P(C1i)P(i)
又因为 P ( C 1 ∣ i ) = 1 P(C_1|i) = 1 P(C1i)=1(因为若像素其值为 i i i,则必定属于 C 1 C_1 C1),且 P ( C 1 ) P(C_1) P(C1)不就是上文所述的 P 1 ( k ) P_1(k) P1(k)嘛,因此可得下式:
m 1 ( k ) = ∑ i = 0 k i P ( i ) P ( C 1 ) = 1 P 1 ( k ) ∑ i = 0 k i P i m_1(k) = \sum_{i = 0}^{k}{i\frac{P(i)}{P(C_1)}} = \frac {1}{P_1(k)}\sum_{i=0}^{k}{iP_i} m1(k)=i=0kiP(C1)P(i)=P1(k)1i=0kiPi
同理可得分到类 C 2 C_2 C2中像素的平均灰度值为:
m 2 ( k ) = 1 P 2 ( k ) ∑ i = k + 1 L − 1 i P i m_2(k) = \frac{1}{P_2(k)}\sum_{i = k+1}^{L-1}{iP_i} m2(k)=P2(k)1i=k+1L1iPi


5.对于 k k k个灰度等级进行累加求均值时,表示为 m ( k ) m(k) m(k):
m ( k ) = ∑ i = 0 k i p i m(k) = \sum_{i=0}^{k}{ip_i} m(k)=i=0kipi
于是—>全局的(也就是整个图像的)灰度均值 m G m_G mG为:
m G   = ∑ i = 0 L − 1 i p i m_G =\sum_{i = 0}^{L-1}{ip_i} mG i=0L1ipi
为什么呢?因为整幅图像的灰度级是 [ 0 , L − 1 ] [0,L-1] [0,L1]


6.经过上述的公式我们可以得到一下结论:(这里暂时忽略 k k k)
m G = P 1 m 1 + P 2 m 2 m_G = P_1m_1 + P_2m_2 mG=P1m1+P2m2
m G − m = ∑ i = k + 1 L − 1 i p i = m 2 P 2 m_G-m = \sum_{i = k+1}^{L-1} {ip_i} = m_2P_2\\ mGm=i=k+1L1ipi=m2P2
P 1 + P 2 = 1 P_1 + P_2 = 1\\ P1+P2=1


7.我们知道OTSU算法又叫做最大类间方差法,所以自然少不了所谓的类间方差,其定义为:
σ B 2 = P 1 ( m 1 − m G ) 2 + P 2 ( m 2 − m G ) 2 \sigma^2_B = P_1(m_1-m_G)^2+P_2(m_2-m_G)^2 σB2=P1(m1mG)2+P2(m2mG)2
上述的就是类间方差的定义, P 1 P_1 P1 P 2 P_2 P2可以理解为"权重", m G m_G mG是全局均值

当然还有一个重要的概念:全局方差 σ G 2 \sigma^2_G σG2(回顾前文中的灰度方差):

σ G 2 = ∑ i = 0 L − 1 ( i − m G ) 2 p i \sigma^2_G = \sum_{i = 0}^{L-1}{(i-m_G)^2p_i} σG2=i=0L1(imG)2pi

现在还是回到类间方差 σ B 2 \sigma^2_B σB2,经过推导我们发现 σ B 2 \sigma^2_B σB2还等价于下面两种形式:

σ B 2 = P 1 P 2 ( m 1 − m 2 ) 2 = ( m G P 1 − m ) 2 P 1 ( 1 − P 1 ) \sigma^2_B = P_1P_2(m_1-m_2)^2=\frac{(m_GP_1-m)^2}{P_1(1-P_1)} σB2=P1P2(m1m2)2=P1(1P1)(mGP1m)2

具体的推导过程见下图: 在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8.根据第7步的公式我们可以看出两个均值 m 1 m_1 m1 m 2 m_2 m2彼此相差越大, σ B 2 \sigma^2_B σB2就越大,还记得最开始的时候我们说过目的:就是可以是分成的两个类之间的差距尽可能的大,然后这个差距具体表现在平均灰度,在这里表现为均值 m 1 m_1 m1 m 2 m_2 m2彼此之差。

也就是说,如果我们的阈值 k k k选的最优,那么 m 1 m_1 m1 m 2 m_2 m2的差距应该最大。另外因为不管阈值怎么改变全局的平均灰度 σ G 2 \sigma^2_G σG2都是不受影响的,也即是个常数。

此时再引入 k k k,用类间方差 σ B 2 \sigma^2_B σB2全局方差 σ G 2 \sigma^2_G σG2的商 η \eta η来表征:
η ( k ) = σ B 2 ( k ) σ G 2 ( k ) \eta(k) = \frac{\sigma^2_B(k)}{\sigma^2_G(k)} η(k)=σG2(k)σB2(k)

σ B 2 ( k ) = [ m G ( k ) P 1 ( k ) − m ( k ) ] 2 P 1 ( k ) [ 1 − P 1 ( k ) ] \sigma^2_B(k) = \frac{[m_G(k)P_1(k)-m(k)]^2}{P_1(k)[1-P_1(k)]} σB2(k)=P1(k)[1P1(k)][mG(k)P1(k)m(k)]2

如果 k ∗ k^* k是最佳阈值,那么 σ B 2 ( k ∗ ) \sigma^2_B(k^*) σB2(k)就是最大化的 σ B 2 ( k ) \sigma^2_B(k) σB2(k).


9.至此,只要我们找出可以使得 σ B 2 ( k ) \sigma^2_B(k) σB2(k)最大化的 k ∗ k^* k就算是找到了最优阈值

一般的寻找方式是:取 k k k所有可能取到的整数值-----位于 [ 0 , L − 1 ] [0,L-1] [0,L1]中,挨个选取,求出使得 σ B 2 ( k ) \sigma^2_B(k) σB2(k)最大的 k k k值即可

如果存在多个 k k k值使得 σ B 2 ( k ) \sigma^2_B(k) σB2(k)最大,那么求 k k k的均值即可.

之后将 k k k作为全局阈值,进行图像分割:
g ( x , y ) = { 1 , f ( x , y ) > k 0 , f ( x , y ) ≤ k g(x,y) = \begin{cases} 1, f(x,y) > k\\ 0, f(x,y) \leq k\\ \end{cases} g(x,y)={1,f(x,y)>k0,f(x,y)k

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值