阈值
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 阅读(200) 评论(0) 收藏 举报
浙公网安备 33010602011771号