您的位置:首页 > 编程语言 > C语言/C++

Otsu(最大类间方差法)方法的C++实现

2015-07-03 11:18 381 查看
         博主的操作平台为vs2010+opencv2.4.9.实现语言为C++。

          话不多说,下面是本人的实现代码:

int threthold_caculation(char imagename[])

{

//转换成灰度图

IplImage *src=cvLoadImage(imagename,0);

if(!src)

{

fprintf(stderr,"读入图像出现错误",imagename);

return -1;

}

//计算分割阈值

int i,j,width,height,step,chanel,threshold;

/*size是图像尺寸,svg是灰度直方图均值,va是方差*/

float size,avg,va,maxVa,p,a,s;

unsigned char *datasrc;

float histogram[256];

width = src->width;

height = src->height;

datasrc = (unsigned char *)src->imageData;

step = src->widthStep/sizeof(char);

chanel = src->nChannels;

//读取图像灰度值

for(i=0;i<256;i++)

histogram[i]=0;

for(i=0;i<height;i++)

for(j=0;j<width*chanel;j++)

{

histogram[datasrc[i*step+j]-'0'+48]++;

}

//计算灰度直方图中值和方差

size=width*height;

for(i=0;i<256;i++)

histogram[i]/=size;

avg=0;

for(i=0;i<256;i++)

avg+=i*histogram[i];

va=0;

for(i=0;i<256;i++)

va+=(i-avg)*(i-avg)*histogram[i];

//otsu方法求阈值门限

threshold=20;

maxVa=0;

p=a=s=0;

for(i=0;i<256;i++)

{

p+=histogram[i];//前i级概率和

a+=i*histogram[i];//前i级灰度均值

s=(avg*p-a)*(avg*p-a)/p/(1-p);//前i级灰度方差值

if(s>maxVa)

{

threshold=i;

maxVa=s;

}

}

cvReleaseImage(&src);

cout<<"分割阈值为:"<<threshold<<endl;

return threshold;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: