阈值

int COCRCls::GetTwoValueT(byte *image,int width,int height)
{
	int Hdata[256];
	memset(Hdata,0,256*sizeof(int));
	int minPixel=255;
	int maxPixel=0;
	int T=0;
	int TT=0;
	for (int i=0;i<height;i++)
	{
		for (int j=0;j<width;j++)
		{
			Hdata[image[i*width+j]]++;
			if (minPixel>image[i*width+j])
			{
				minPixel=image[i*width+j];
			}
			if (maxPixel<image[i*width+j])
			{
				maxPixel=image[i*width+j];
			}
		}
	}
	long IP1,IP2,SP1,SP2;
	int MeanG1=0;
	int MeanG2=0;
	double w0,w1;
	double G,tmpG;
	G=0;
	tmpG=0;
	for (int i=minPixel;i<=maxPixel;i++)
	{
		T=i;
		IP1=0;
		IP2=0;
		SP1=0;
		SP2=0;
		for (int j=minPixel;j<=T;j++)
		{
			IP1+=Hdata[j]*j;
			SP1+=Hdata[j];
		}
		if (SP1!=0)
		{
			MeanG1=IP1/SP1;
		}
		else
		{
			MeanG1=0;
		}
		w0=(double)SP1/(double)(width*height);
		for (int j=T+1;j<=maxPixel;j++)
		{
			IP2+=Hdata[j]*j;
			SP2+=Hdata[j];
		}
		if (SP2!=0)
		{
			MeanG2=IP2/SP2;
		}
		else
		{
			MeanG2=0;
		}
		w1=1-w0;
		G=(double)((w0*w1)*(MeanG1-MeanG2)*(MeanG1-MeanG2));
		if (G>tmpG)
		{
			tmpG=G;
			TT=T;
		}
	}
	return TT;
}
//二值化
void COCRCls::TwoValue(byte *imagedata,int width,int height,int T)
{
	for(int i=0;i<height;i++)
	{
		for (int j=0;j<width;j++)
		{
			int tmp=imagedata[i*width+j];
			imagedata[i*width+j]=tmp>T?0:255;
		}
	}
}

  

posted on 2014-06-30 20:53  vincent_SK  阅读(186)  评论(0编辑  收藏  举报