图像二值化: 局部阈值值化 - Niblack's method

来源:互联网 发布:八爪盒子 知乎 编辑:程序博客网 时间:2024/04/30 17:00

图像二值化: 局部阈值值化 - 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,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];
         &nbsp;   //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;
    }

0 0