大津算法

维基百科,自由的百科全书
跳转至: 导航搜索

最大类间方差法是由日本学者大津展之于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标两部分。背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为\omega_0 \,,其平均灰度\mu_0;背景像素点数占整幅图像的比例为\omega_1,其平均灰度为\mu_1。图像的总平均灰度记为\mu,类间方差记为g。假设图像的背景较暗,并且图像的大小为M*N,图像中像素的灰度值小于阈值T的像素个数记作N_0,像素灰度大于阈值T的像素个数记作N_1,则有:

 \omega_0=\frac{N_0}{M*N}           (1)
  \omega_1=\frac{N_1}{M*N}            (2)
  N_0+N_1=M*N           (3)
  \omega_0+\omega_1=1           (4)
  \mu=\omega_0*\mu_0+\omega_1*\mu_1             (5)
  g=\omega_0(\mu_0-\mu)^2+\omega_1(\mu_1-\mu)^2            (6)

将式(5)代入式(6),得到等价公式:

  g=\omega_0\omega_1(\mu_0-\mu_1)^2             (7)

采用遍历的方法得到使类间方差最大的阈值T,即为所求。

示例程序:

int  Otsu(long *pg, long *pg1)                     //  大津法取阈值
{
   int  i,j,p;
   double A,B,An,Bn,u,v,qqq[256],max,min;
   An=Bn=0;
 
    for (i=0;i<256;i++)
    {
         An+=pg;     
         Bn+=pg*(i+1);
    }
    for (j=0;j<256;j++)
    {
         A=B=0;
         for (i=0;i<=j;i++)
         {
              A+=pg;
              B+=pg*(i+1);
         }
         if (A) {u=B/A;}
         else   u=0;
         if (An-A) {v=(Bn-B)/(An-A);}
         else v=0;
         qqq[j]=A*(An-A)*(u-v)*(u-v);                //  计算类间方差
    }
    max=min=qqq[0];  p=0;
    for (i=1;i<256;i++)  //  寻找判别函数最大值
    {                    
         if (qqq>max)
         {
              max=qqq;
              p=i;
         }
         else if (qqq<min) min=qqq;
    }
    if (pg1!=0)
    {
         for (i=0;i<256;i++)
         {
              pg1=(long) (120*(qqq-min)/(max-min));
         }
    }
    return(p);                   //  取判别函数最大值的灰度为其阈值
}

注:这段程序使用了浮点型运算,如果在定点单片机上运行的话,要做相应的改进,将浮点转成定点运算,可以提高运算的精度和速度。