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;
        }
  • 相关阅读:
    css 解决fixed 布局下不能滚动的问题
    js 正则常用函数 会正则得永生
    巧用call,appl有 根据对象某一属性求最大值
    锚点 , angular 锚点 vue锚点
    css 改变浏览器滚动条的样式
    angular 常用插件集合
    angular4,angular6 父组件异步获取数据传值子组件 undefined 问题
    angular组件之间的通讯
    tomcat的配置详解:[1]tomcat绑定域名
    click 绑定(三)防止事件冒泡
  • 原文地址:https://www.cnblogs.com/cv-pr/p/4599543.html
Copyright © 2011-2022 走看看