// 局部阈值处理2值化,niblack's method
/*原理:
T(x,y)=m(x,y) + k*s(x,y)
取一个宽度为w的矩形框,(x,y)为这个框的中心。
统计框内数据,T(x,y)为阈值,m(x,y)为均值,s(x,y)为均方差,k为参数(推荐-2)计算出t再对(x,y)进行切割255/0。
这个算法的优点是 速度快,效果好。
缺点是 niblack's method会产生一定的噪声。
*/
public int[] localThresholdProcess(int []data,int width,int height,int w,int h,double coefficients,double gate){
int[] processData=new int[data.length];
for(int i=0;i<data.length;i++){
processData[i]=255;
}
if(data.length!=width*height)
return processData;
int wNum=width/w;
int hNum=height/h;
int delt[]=new int[w*h];
//System.out.println("w; "+w+" h:"+h+" wNum:"+wNum+" hNum:"+hNum);
for(int j=0;j<hNum;j++){
for(int i=0;i<wNum;i++){
//for(int j=0;j<1;j++){
// for(int i=0;i<1;i++){
for(int n=0;n<h;n++)
for(int k=0;k<w;k++){
delt[n*w+k]=data[(j*h+n)*width+i*w+k];
//System.out.print("delt["+(n*w+k)+"]: "+delt[n*w+k]+" ");
}
//System.out.println();
/*
for(int n=0;n<h;n++)
for(int k=0;k<w;k++){
System.out.print("data["+((j*h+n)*width+i*w+k)+"]: "+data[(j*h+n)*width+i*w+k]+" ");
}
System.out.println();
*/
delt=thresholdProcess(delt,w,h,coefficients,gate);
for(int n=0;n<h;n++)
for(int k=0;k<w;k++){
processData[(j*h+n)*width+i*w+k]=delt[n*w+k];
// System.out.print("delt["+(n*w+k)+"]: "+delt[n*w+k]+" ");
}
//System.out.println();
/*
for(int n=0;n<h;n++)
for(int k=0;k<w;k++){
System.out.print("processData["+((j*h+n)*width+i*w+k)+"]: "+processData[(j*h+n)*width+i*w+k]+" ");
}
System.out.println();
*/
}
}
return processData;
}