图像otsu阈值化

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值