基于一维最大熵二值化方法的阈值分割,参考文献:
[1]. Kapur, J.N.; Sahoo, P.K.; Wong, A.K.C. A new method for gray-level picture thresholding using the entropy of the histogram. Comput. Vis. Graph. Image Process. 1985, 29, 273–285.
C++实现的代码如下:
/** *@name Threshold1DMaxEntropy *@brief 计算灰度直方图的分割阈值,基于一维最大熵方法 *@param[in] in_Hist 输入灰度直方图 *@param[in] in_Start 直方图索引的起始位置 *@param[in] in_End 直方图索引的结束位置 *@return int 返回分割的阈值 */ static int Threshold1DMaxEntropy(const int* in_Hist, const int in_Start, const int in_End) { int X, Y, Amount = 0; double HistGramD[256]; double SumIntegral, EntropyBack, EntropyFore, MaxEntropy; int MinValue = in_Start, MaxValue = in_End; int Threshold = 0; for (MinValue = in_Start; MinValue < in_End && in_Hist[MinValue] == 0; MinValue++) ; for (MaxValue = in_End; MaxValue > MinValue && in_Hist[MinValue] == 0; MaxValue--) ; if (MaxValue == MinValue) return MaxValue; // 图像中只有一个颜色 if (MinValue + 1 == MaxValue) return MinValue; // 图像中只有二个颜色 for (Y = MinValue; Y <= MaxValue; Y++) Amount += in_Hist[Y]; // 像素总数 for (Y = MinValue; Y <= MaxValue; Y++) HistGramD[Y] = (double)in_Hist[Y] / Amount + 1e-17; MaxEntropy = -10000000; for (Y = MinValue + 1; Y < MaxValue; Y++) { SumIntegral = 0; for (X = MinValue; X <= Y; X++) SumIntegral += HistGramD[X]; EntropyBack = 0; for (X = MinValue; X <= Y; X++) EntropyBack += (-HistGramD[X] / SumIntegral * log(HistGramD[X] / SumIntegral)); EntropyFore = 0; for (X = Y + 1; X <= MaxValue; X++) EntropyFore += (-HistGramD[X] / (1 - SumIntegral) * log(HistGramD[X] / (1 - SumIntegral))); if (MaxEntropy < EntropyBack + EntropyFore) { Threshold = Y; MaxEntropy = EntropyBack + EntropyFore; } } return Threshold; }