基于Niblack's method方法的局部阈值分割
Email:whowhoha@outlook.com
/*原理:
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,intheight,int w,int h,doublecoefficients,double gate){
int[] processData=newint[data.length];
for(inti=0;i<data.length;i++){
processData[i]=255;
}
if(data.length!=width*height)
returnprocessData;
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(inti=0;i<wNum;i++){
//for(int j=0;j<1;j++){
// for(int i=0;i<1;i++){
for(intn=0;n<h;n++)
for(intk=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(intn=0;n<h;n++)
for(intk=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(intn=0;n<h;n++)
for(intk=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(intn=0;n<h;n++)
for(intk=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;
}