最大类间方差法otsu (大津算法)

性能:
类间方差法对噪音和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。
当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。
公式推导:
记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。
则图像的总平均灰度为:u=w0*u0+w1*u1。
前景和背景图象的方差:g=w0*(u0-u)*(u0-u)+w1*(u1-u)*(u1-u)=w0*w1*(u0-u1)*(u0-u1),此公式为方差公式。
可参照课本上面的g的公式也就是下面程序中的sb的表达式。当方差g最大时, 概率论可以认为此时前景和背景差异最大,此时的灰度t是最佳阈值sb = w0*w1*(u1-u0)*(u0-u1)

sum = csum = 0.0;
    n = 0;
    for (k = 0; k <= 255; k++)
    {
        sum += (double) k * (double) ihist[k]; // x*f(x) 质量矩
        n += ihist[k]; //f(x) 质量
    }
    if (!n)
    {
        // if n has no value, there is problems
        fprintf (stderr, "NOT NORMAL thresholdValue = 160\n");
        return (160);
    }
    // do the otsu global thresholding method
    fmax = -1.0;
    n1 = 0;
    for (k = 0; k < 255; k++)
    {
        n1 += ihist[k];
        if (!n1) { continue; }
        n2 = n - n1;
        if (n2 == 0) { break; }
        csum += (double) k *ihist[k];
        m1 = csum / n1;
        m2 = (sum - csum) / n2;
        sb = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
        /**//* bbg: note: can be optimized. */
        if (sb > fmax) {
            fmax = sb;
            thresholdValue = k;
        }
    }


你可能感兴趣的:(最大类间方差法otsu (大津算法))