二值化自动阈值计算?

解决方案 »

  1.   

    前一阵我学习了一下 阈值分割 建议你用ostu方法
    效果不错,尤其是处理灰度图像
      

  2.   

    这个对你应该有用!
    #ifndef _CThreshold_H_
    #define _CThreshold_H_//计算最佳阈值
    class CThreshold
    {
    enum {N=256};
    public:
    CThreshold(){}
    ~CThreshold(){}
    void set(int gray[N],int a[],int n=N);
    double GetThreshold();
    protected:
    double GetOneThreshold(int t); //计算一个阈值
    void   GetUT(); //计算图象灰度平均值
    private:
    int gray[N],n[N],m_total,m_ntotal;
    double m_ut,m_threshold; //图象灰度平均值
    };#endif //_CThreshold_H_#include "stdafx.h"
    #include "cthreshold.h"
    #define  SQR(x) (x)*(x)void CThreshold::set(int g[],int a[],int total)
    {
    m_total=total;
    for(int i=0;i<m_total;i++){
    n[i]=a[i];
    gray[i]=g[i];
    }
    GetUT();
    }void CThreshold::GetUT()
    {
    int nTotal=0;
    m_ut=0.0; m_ntotal=0;
    for(int i=0;i<m_total;i++)
    nTotal+=n[i];
    for(i=0;i<m_total;i++){
    m_ut+=1.0*gray[i]*n[i]/nTotal;
    m_ntotal+=n[i];
    }
    }double CThreshold::GetOneThreshold(int t)
    {
    //计算类C1的像素灰度平均值和方差,发生概率
    double u1=0.0,s1=0.0,w1=0.0;
    int total=0;
    for(int i=0;i<t;i++) total+=n[i];
    for(i=0;i<t;i++){
    u1+=1.0*gray[i]*n[i]/total;
    w1+=1.0*n[i]/m_ntotal;
    }
    for(i=0;i<t;i++) s1+=1.0*SQR(gray[i]-u1)*n[i]/total;

    //计算类C2的像素灰度平均值和方差
    double u2=0.0,s2=0.0,w2=0.0;
    total=0;
    for(i=t;i<m_total;i++) total+=n[i];
    for(i=t;i<m_total;i++){
    u2+=1.0*gray[i]*n[i]/total;
    w2+=1.0*n[i]/m_ntotal;
    }
    for(i=t;i<m_total;i++) s2+=1.0*SQR(gray[i]-u2)*n[i]/total;

    double sw2=w1*s1+w2*s2;
    double sb2=w1*SQR(u1-m_ut)+w2*SQR(u2-m_ut);
    return sb2/sw2;
    }double CThreshold::GetThreshold()
    {
    m_threshold=0;
    double nSepMax=0.0; //求分离度最大的值
    for(int t=0;t<m_total;t++){
    double temp=GetOneThreshold(gray[t]);
    if(temp>nSepMax){
    nSepMax=temp;
    m_threshold=gray[t];
    }
    }
    return m_threshold;
    }
      

  3.   

    关于二值化最佳阈值的计算有很多算法,可分为一维算法和二维算法。
    一维算法中比较经典的有:大津法(OSTU算法,即类间方差最大法),叠代法,最小错误分割法等等。这些算法都很容易找到,也很容易实现,效果也还行。
        这些经典算法主要适合直方图具有明显双峰特性的图像,即背景和目标要有良好的区分性。如果图像质量较差,就要用其他适应性更强的推广算法。    P.S. 以上均为整体阈值法的范畴。
      

  4.   

    关于大多数经典算法,可以上网搜索。
    其他改进和推广算法在一些期刊网能找到,我是在中国期刊网上找的。
    我下了很多相关算法的论文,楼主若是需要,请留下email,我发一些给你。
      

  5.   

    crs96321(小沈) 能否告诉你给出代码的用法
    特别是
    set(int g[],int a[],int total)函数中各参数的具体意义谢谢
      

  6.   

    NiBlack是个局部yuzhi不错的算法啊