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;
}
话不多说,下面是本人的实现代码:
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;
}
相关文章推荐
- 《C语言及程序设计》程序阅读——条件编译
- 让你提前知道软件开发(24):C语言和主要特征的历史
- c++Builder XML XMLDocument
- C++ 类型转换
- C++嵌套类的使用及对外部类的访问权限
- C,C++,VC++有什么区别
- C++ Primer学习笔记(3)——神奇的容器vector及其迭代器iterator
- C++实现单链表
- 写一个用矩形法求定积分的通用函数,分别求:sin(x),cos(x),e^x
- C++计时器
- c语言学生信息管理系统(链表、文件)
- 黑马程序员---C语言基础---if条件句
- 关于学习C++和编程的50个建议和观点
- C++ 程序员如何迎接 Windows 10 的到来
- VIM配置C++开发环境
- C++动态数组
- C++编译器函数模版机制剖析 - 函数模版的本质
- C++编译器函数模版机制剖析 - 函数模版的本质
- C++结构变量数据对齐问题
- C++结构变量数据对齐问题 分类: C/C++ 2015-07-03 09:07 157人阅读 评论(0) 收藏