Otsu算法的原理
最大类间方差法(Otus算法),可以自动的选取二值化的阈值。
它的原理如下:
- 假设一副灰度图有
L个灰度级,即
[1,2,3,...L] ,灰度级为
i的像素点有
ni个,那么总的像素点个数
N=n1+n2+...+nl。那么一个像素点灰度级为
i的概率为:
pi=Nni(pi>0,i=1∑Lpi=1)。
- 现在假设通过一个灰度级
k将这些像素点划分为两类
C0和
C1,
[1,2,...k]是
C0,二值化为
0。
[k+1,k+2,...L]是
C1,二值化为
255。Otsu算法就是自动的找到这个算法认为的最优的阈值
k。
-
C0和
C1两类,每一类出现的概率以及各类的平均灰度级分别由下面的式子给出:
ω0=Pr(C0)=C0类出现的概率=i=1∑kpi=ω(k)
ω1=Pr(C1)=C1类出现的概率=i=k+1∑Lpi=1−ω(k)
μ0=i=1∑ki∗Pr(i∣C0)=i=1∑ki∗ω0pi=C0类的平均灰度级=ω(k)μ(k)
μ1=i=k+1∑Li∗Pr(i∣C1)=i=k+1∑Li∗ω1pi=C1类的平均灰度级=1−ω(k)μT−μ(k)
其中:
μ(k)=i=1∑ki∗pi,是
1到k的平均灰度级。
μT=i=1∑Li∗pi,是整幅图的平均灰度级。
- 容易验证:
ω0μ0+ω1μ1=μT,
ω0+ω1=1
-
C0和
C1各自的类内方差如下:
σ02=i=1∑k(i−μ0)2Pr(i∣C0)=i=1∑k(i−μ0)2ω0pi
σ12=i=k+1∑L(i−μ1)2Pr(i∣C1)=i=k+1∑L(i−μ1)2ω1pi
- 所以整幅图片的类内方差,两个类的类间方差,图片的总方差,分别如下:
σW2=整幅图片的类内方差=ω0σ02+ω1σ12
σB2=两个类的类间方差=ω0(μ0−μT)2+ω1(μ1−μT)2
跟据4.中两个等式,可以将
σB2化简为
ω0ω1(μ1−μ0)2
σT2=图片的总方差=i=k+1∑L(i−μT)2pi
- 因为
σT2与
k无关。
σW2是二阶统计(类方差),而
σB2是一阶统计(类均值)。所以
σB2,即类间方差是最简单的判断
k选取好坏的评判标准。
- 所以Otus算法遍历
k,最后选取使
σB2最大的
k作为阈值。
opencv中的Otsu算法
_, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
结语
如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。