基於直方圖的圖像全局二值化算法原理、實現--迭代最佳閾值

1、描述:

    該算法先假定一個閾值,然後計算在該閾值下的前景和背景的中心值,當前景和背景中心值得平均值和假定的閾值相同時,則迭代中止,並以此值爲閾值進行二值化。

2、實現過程:

  (1)求出圖象的最大灰度值和最小灰度值,分別記爲gl和gu,令初始閾值爲:

                        

      (2) 根據閾值T0將圖象分割爲前景和背景,分別求出兩者的平均灰度值Ab和Af:

              

      (3) 令

                          

    如果Tk=Tk+1,則取Tk爲所求得的閾值,否則,轉2繼續迭代

     3、參考代碼:

int GetIterativeBestThreshold(int* HistGram)
    {
        int X, Iter = 0;
        int MeanValueOne, MeanValueTwo, SumOne, SumTwo, SumIntegralOne, SumIntegralTwo;
        int MinValue, MaxValue;
        int Threshold, NewThreshold;

        for (MinValue = 0; MinValue < 256 && HistGram[MinValue] == 0; MinValue++) ;
        for (MaxValue = 255; MaxValue > MinValue && HistGram[MinValue] == 0; MaxValue--) ;

        if (MaxValue == MinValue) return MaxValue;          // 圖像中只有一個顏色             
        if (MinValue + 1 == MaxValue) return MinValue;      // 圖像中只有二個顏色

        Threshold = MinValue;
        NewThreshold = (MaxValue + MinValue) >> 1;
        while (Threshold != NewThreshold)    // 當前後兩次迭代的獲得閾值相同時,結束迭代    
        {
            SumOne = 0; SumIntegralOne = 0;
            SumTwo = 0; SumIntegralTwo = 0;
            Threshold = NewThreshold;
            for (X = MinValue; X <= Threshold; X++)         //根據閾值將圖像分割成目標和背景兩部分,求出兩部分的平均灰度值      
            {
                SumIntegralOne += HistGram[X] * X;
                SumOne += HistGram[X];
            }
            MeanValueOne = SumIntegralOne / SumOne;
            for (X = Threshold + 1; X <= MaxValue; X++)
            {
                SumIntegralTwo += HistGram[X] * X;
                SumTwo += HistGram[X];
            }
            MeanValueTwo = SumIntegralTwo / SumTwo;
            NewThreshold = (MeanValueOne + MeanValueTwo) >> 1;       //求出新的閾值
            Iter++;
            if (Iter >= 1000) return -1;
        }
        return Threshold;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章