一维最大熵二值化方法

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

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

 

转载于:https://www.cnblogs.com/cv-pr/p/4599543.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值