otsu全局二值化算法,文献出处: Nobuyuki Otsu. A Threshold Selection Method from Gray-Level Histograms.IEEE Transactions on Systems, Man, and Cybernetics. 1979.SMC-9(1):62-66。
效果图如下:
otsu的c语言程序如下:
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void otsu(BYTE **ir, BYTE **ir1,int xz,int yz,int hg,int wt )
{
double counts=0,meanT=0,w0,w1=0,miuK=0,n,em,vart=0,maxj=0,index=0;int it=0;
double *imhist;double *Grade;
imhist= new double[256];
Grade= new double[256];
for(int l=0;l<256;l++)
{
imhist[l]=0.0;
Grade[l]=0.0;
}
for(int i=xz;i<xz+hg;i++)
{
for(int j=yz;j<yz+wt;j++)
{
imhist[ir[i][j]]=imhist[ir[i][j]]+1;
}
}
for(l=0;l<256;l++)
{
counts=counts+imhist[l];
}
for(l=0;l<256;l++)
{
Grade[l]=(double)imhist[l]/counts;
}
meanT=0;
for(l=0;l<256;l++)
{
meanT=meanT+Grade[l]*l;
}
for(l=0;l<256;l++)
{
vart=vart+pow((l-meanT),2)*Grade[l];
}
w0 = Grade[0];
miuK = 0;
imhist[0]=0;
n = 255;
for(l=0;l<=n;l++)
{
w1=w1+Grade[l];
}
for(l=0;l<n;l++)
{
w0=w0+Grade[l+1];
miuK = miuK + (l+1)* Grade[l+1];
if ((w0==0 )|| (w0==w1))
{
imhist[l+1]=0.0;
}
else
{
imhist[l+1] = (double)pow((w0*meanT-miuK),2)/(w0*(1-w0));
}
}
for(l=0;l<=n;l++)
{
if(maxj<imhist[l])
maxj=imhist[l];
}
em=maxj/vart;
for(l=0;l<=n;l++)
{
if(maxj==imhist[l])
{
index=index+l;
it++;
}
}
index=index/it;
index=(index-1)/n;
for(i=xz;i<xz+hg;i++)
{
for(int j=yz;j<yz+wt;j++)
{
if(ir[i][j]>=255*index)
ir1[i][j]=1;
else
ir1[i][j]=0;
}
}
delete[] imhist;
imhist= NULL ;
delete[] Grade;
Grade= NULL;
}