zoukankan      html  css  js  c++  java
  • 一维最大熵二值化方法

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

    [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;
        }
  • 相关阅读:
    工序打扎流程(自定义按钮移动、群响应。)
    将FAT磁盘转化为NTFS格式。
    VC监视新硬件插入电脑。
    VC读取分析网络文件
    工序打扎流程(箭头实现、刷新画面)
    VC实现自定义按钮响应拖动
    VC中ListCtrl经验总结【转载】
    C++的优先级
    VC画面闪烁及解决方法
    改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景
  • 原文地址:https://www.cnblogs.com/cv-pr/p/4599543.html
Copyright © 2011-2022 走看看