图像大津阈值

#include "highgui.h"
#include "cv.h"
void otsu(const IplImage* src,IplImage* dest,double* his)//ousu二值化
{
int i,s=0,t,k=0;
double p[256]={0.0},w0=0.0,w1=0.0,u0=0.0,u1=0.0,u=0.0,g[256]={0.0},m0=0.0,m1=0.0,max=0.0,num=0.0;
int height=src->height;
int width=src->width;
s=height*width;
for(i=0;i<256;i++)
p[i]=his[i]/s;
for(t=0;t<256;t++)   
{
w0=w1=u0=u1=u=m0=m1=0.0;
   for(i=0;i<t;i++)
{
  w0=w0+p[i];
}
for(i=0;i<t;i++)
   m0 = m0+i*p[i];//printf("m0=%f\n",m0);
for(i=255;i>=t;i--)
m1=m1+i*p[i];
w1=1.0-w0;
u0=m0/w0;
u1=m1/w1;
u=m0+m1;
//g[t]=w0*(u0-u*u)+w1*(u1-u*u);
g[t]=(u*w0-m0)*(u*w0-m0)/(w0*w1);//printf("%f\n",g[t]);
}
max=g[1];
for(i=2;i<256;i++)
  if(max<g[i])
 max=g[i];
for(i=1;i<256;i++)
//{   printf("%f||%d\n",max,i);
if(max==g[i])break;
k=i;printf("otsu最佳阈值灰度为%d",k);
cvThreshold(src,dest,k,255,CV_THRESH_BINARY);
}
int main(int argv,char** argc)
{
int i,j,s=0;
double his[256]={0.0};
IplImage* src=cvLoadImage("C:\\Users\\CDZHYF\\Desktop\\12.jpg",1);
IplImage*dest=cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
IplImage*dst=cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
IplImage*temp=cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
int height=src->height;
int width=src->width;
for(i=0;i<height;i++)
for(j=0;j<width;j++)
his[CV_IMAGE_ELEM(src,uchar,i,j)]++;//histogram

otsu(src,dest,his);//otsu二值化
cvMorphologyEx(dest,dst,temp,NULL,CV_MOP_OPEN,1);//开运算


for(i=0;i<height;i++)
for(j=0;j<width;j++)
his[CV_IMAGE_ELEM(dst,uchar,i,j)]++;//histogram
s=his[255];printf("\n%d",s);


cvNamedWindow("otsu二值化",CV_WINDOW_AUTOSIZE);
cvShowImage("otsu二值化",dst);
cvWaitKey(0);
cvReleaseImage(&dst);
  cvDestroyWindow("otsu二值化");
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值