基于直方图的图像全局二值化算法原理、实现--一维最大熵

来源:互联网 发布:2016年网络词汇 编辑:程序博客网 时间:2024/05/21 21:43

 1、描述:

       该算法把信息论中熵的概念引入到图像中,通过计算阈值分割后两部分熵的和来判断阈值是否为最佳阈值。

 2、算法原理

  

3、参考代码: 

int Get1DMaxEntropyThreshold(int* HistGram)
    {        int  X, Y,Amount=0;        double* HistGramD = new double[256];        double SumIntegral, EntropyBack, EntropyFore, MaxEntropy;        int MinValue = 255, MaxValue = 0;        int Threshold = 0;        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;      // 图像中只有二个颜色        for (Y = MinValue; Y <= MaxValue; Y++) Amount += HistGram[Y];        //  像素总数        for (Y = MinValue; Y <= MaxValue; Y++)   HistGramD[Y] = (double)HistGram[Y] / Amount+1e-17;        MaxEntropy = double.MinValue; ;        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 * Math.Log(HistGramD[X] / SumIntegral));            EntropyFore = 0;            for (X = Y + 1; X <= MaxValue; X++) EntropyFore += (-HistGramD[X] / (1 - SumIntegral) * Math.Log(HistGramD[X] / (1 - SumIntegral)));            if (MaxEntropy < EntropyBack + EntropyFore)            {                Threshold = Y;                MaxEntropy = EntropyBack + EntropyFore;            }        }        return Threshold;    }
0 0
原创粉丝点击