1、描述:
該算法先假定一個閾值,然後計算在該閾值下的前景和背景的中心值,當前景和背景中心值得平均值和假定的閾值相同時,則迭代中止,並以此值爲閾值進行二值化。
2、實現過程:
(1)求出圖象的最大灰度值和最小灰度值,分別記爲gl和gu,令初始閾值爲:
(2) 根據閾值T0將圖象分割爲前景和背景,分別求出兩者的平均灰度值Ab和Af:
(3) 令
如果Tk=Tk+1,則取Tk爲所求得的閾值,否則,轉2繼續迭代。
3、參考代碼:
{ 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; }