Otsu的C语言实现

翻译 2016年08月31日 15:34:31
//===============================================================================
//
//  函数名称:OTSU_threshold
//  功能说明:经典大津算法 动态阈值
//  修改时间:2016-8-31
//  备    注:
//      Otsu实现思路
//  1.计算0~255各灰阶对应的像素个数,保存至一个数组中,该数组下标是灰度值,保存内容是当前灰度值对应像素数
//  2.计算背景图像的平均灰度、背景图像像素数所占比例
//  3.计算前景图像的平均灰度、前景图像像素数所占比例
//  4.遍历0~255各灰阶,计算并寻找类间方差极大值
//===============================================================================
#define Gourd 256
uint8 OTSU_threshold(uint8 *pic,uint16 num)
{
   uint16 i=0;
   uint16 Histogram[Gourd];//直方图histogram
   for (i=0;i<Gourd;i++)
       Histogram[i]=0;//数组清零

   for (i=0;i<num;i++)
   {
       Histogram[(int)pic[i]*Gourd/256]++;//遍历每个像素,计算每个灰度级的像素个数和。
   }

  float pt[Gourd],w[Gourd],u[Gourd],o[Gourd],Ut;

  pt[0]=(float)Histogram[0]/num;
  w[0]=pt[0];
  u[0]=w[0];

  for(i=1;i<Gourd;i++)
  {
    pt[i]=(float)Histogram[i]/num; //灰度级为i的像素个数占总像素的比例
    w[i]=w[i-1]+pt[i];//进行pt[i]的累加。对图像像素数所占比例进行累加
    u[i]=u[i-1]+i*pt[i];//进行i*pt[i]的累加,从而计算出平均灰度(每个灰度级*每个灰度级所占的比例) 
  };
  Ut=u[Gourd-1];//整幅图像平均灰度

  for(i=0;i<Gourd;i++)
  {
    o[i]=(1-pt[i])*(u[i]*u[i]/w[i]+(u[i]-Ut)*(u[i]-Ut)/(1-w[i]));//方差
  };

  int maxi=0;
  float maxo=0;

  for(i=0;i<Gourd;i++)
  {
    if(o[i]!=0x7FC0000)
    if(o[i]>maxo){maxo=o[i];maxi=i;}//遍历0~255各灰阶,计算并寻找类间方差极大值,当找到时,i为对应类间方差的灰度值

  }
  return maxi*256/Gourd;
}
//Otsu的C++实现
//转自

> http://www.cnblogs.com/gzy-zju-edu/articles/4202252.html

int Otsu(IplImage* src)        
{        
    int height=src->height;        
    int width=src->width;            

    //histogram        
    float histogram[256] = {0};        
    for(int i=0; i < height; i++)      
    {        
        unsigned char* p=(unsigned char*)src->imageData + src->widthStep * i;        
        for(int j = 0; j < width; j++)       
        {        
            histogram[*p++]++;        
        }        
    }        
    //normalize histogram        
    int size = height * width;        
    for(int i = 0; i < 256; i++)      
    {        
        histogram[i] = histogram[i] / size;        
    }        

    //average pixel value        
    float avgValue=0;        
    for(int i=0; i < 256; i++)      
    {        
        avgValue += i * histogram[i];  //整幅图像的平均灰度      
    }         

    int threshold;          
    float maxVariance=0;        
    float w = 0, u = 0;        
    for(int i = 0; i < 256; i++)       
    {        
        w += histogram[i];  //假设当前灰度i为阈值, 0~i 灰度的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例      
        u += i * histogram[i];  // 灰度i 之前的像素(0~i)的平均灰度值: 前景像素的平均灰度值      

        float t = avgValue * w - u;        
        float variance = t * t / (w * (1 - w) );        
        if(variance > maxVariance)       
        {        
            maxVariance = variance;        
            threshold = i;        
        }        
    }        

    return threshold;        
}

OTSU算法提取图像阈值的C语言实现

OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背...
  • shengzhuzhu
  • shengzhuzhu
  • 2012年05月02日 21:04
  • 3779

opencv最大类间方差法(otsu)实现(三种算法比较)

OTSU算法:就是计算出灰度图最佳阈值的算法 1.先对灰度图进行直方图计算并归一化处理,得到0-255之间每个像素在灰度图中出现的概率,即表示为某个像素在灰度图中出现了n个,灰度图总的像素点为N个,则...
  • moses1213
  • moses1213
  • 2015年04月22日 22:36
  • 4179

二维OTSU算法快速实现

OTSU自适应阈值选取算法
  • yao_wust
  • yao_wust
  • 2014年04月12日 15:11
  • 4875

OpenCV实现验证otsu算法

otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找一个合适的灰...
  • Augusdi
  • Augusdi
  • 2013年06月03日 11:51
  • 10995

多阈值处理利用双Otsu阈值-C#实现-基于EmguCv

对于一张图片,Otsu处理是寻找一个最适阈值进行分隔,而此算法是改进,寻找两个最适阈值,将图片分割成3个部分。 吃算法的理论可以参考《数字图像处理第三版-冈萨雷斯》10.3.6节,这里不予写出。 ...
  • anjisi
  • anjisi
  • 2016年09月22日 19:36
  • 819

图像处理之基于Otsu阈值二值化

基于Otsu阈值方法实现图像二值化
  • jia20003
  • jia20003
  • 2015年02月23日 12:33
  • 10936

自适应阈值分割—大津法(OTSU算法)C++实现

大津法是一种图像灰度自适应的阈值分割算法,是1979年由日本学者大津提出,并由他的名字命名的。大津法按照图像上灰度值的分布,将图像分成背景和前景两部分看待,前景就是我们要按照阈值分割出来的部分。背景和...
  • dcrmg
  • dcrmg
  • 2016年08月16日 21:46
  • 8845

opencv 最大类间方差(大津法OTSU)

参考: otsu (大津算法):http://baike.baidu.com/link?url=mvcFw6K8H3ko-un4dibuDifmdU9u_skxLryut9OrHs_5V2GdIPV...
  • u012005313
  • u012005313
  • 2016年07月18日 21:03
  • 11236

Otsu最佳全局算法c#实现-基于EmguCV

算法网上有很多详细介绍的,这里就不讲,只贴代码,本人是根据《数字图像处理第三版》冈萨雷斯 里面所描述,再根据自己的理解写出来的,可能会存在一些问题。 代码也没进行优化,可能运行速度比较慢。 此函数...
  • anjisi
  • anjisi
  • 2016年09月22日 02:29
  • 737

OTSU算法对图像二值化

版权声明:本文为博主原创文章,未经博主允许不得转载。  转载请注明出处:http://blog.csdn.net/WuHaibing_CVer OTSU算法是由日本学者O...
  • hktkfly6
  • hktkfly6
  • 2017年04月05日 00:06
  • 449
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Otsu的C语言实现
举报原因:
原因补充:

(最多只允许输入30个字)