一维最大熵二值化方法

基于一维最大熵二值化方法的阈值分割,参考文献:

[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;
    }

 

posted @ 2015-06-25 11:29  horsetail  阅读(1232)  评论(0编辑  收藏  举报