📄 jbfzcl.java
字号:
package image;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.awt.image.Raster;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
//***********************局部阀值处理
public class Jbfzcl extends BasicImage{
// 局部阈值处理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会产生一定的噪声。
*/
int w=0;
int h=0;
double coefficients=0;
double gate=0;
public Jbfzcl() {
super();
// TODO 自动生成构造函数存根
}
public Jbfzcl(String fileName,int w,int h,double coeffients,double gate) {
super(fileName);
this.w=w;
this.h=h;
this.coefficients=coeffients;
this.gate=gate;
// TODO 自动生成构造函数存根
}
public int[] thresholdProcess(int []data,int width,int height,double coefficients,double gate){
int [] processData=new int[data.length];
if(data.length!=width*height)
return processData;
else{
double sum=0;
double average=0;
double variance=0;
double threshold;
if( gate!=0){
threshold=gate;
}
else{
for(int i=0;i<width*height;i++){
sum+=data[i];
}
average=sum/(width*height);
for(int i=0;i<width*height;i++){
variance+=(data[i]-average)*(data[i]-average);
}
variance=Math.sqrt(variance);
threshold=average-coefficients*variance;
}
for(int i=0;i<width*height;i++){
if(data[i]>threshold)
processData[i]=255;
else
processData[i]=0;
}
return processData;
}
}
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;
}
public Image imageProcess()
{
System.out.println("-------------imageProcess()");
System.out.println("-------------imageData"+imageData[1]);
int [] data_processed=this.localThresholdProcess(this.imageData,this.wideth,this.height,this.w,this.h,this.coefficients,this.gate);
imageProcessed=this.createImage(data_processed);
return imageProcessed;
}
public void saveImageAfterProcess()
{
System.out.println("-------------imageProcess()");
this.saveImage("d:\\006.bmp");
}
public void showImageAfterProcess()
{}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
Jbfzcl zyy=new Jbfzcl("003.jpg",2,2,0.5,0.4);
zyy.imageProcess();
zyy.saveImage("d:\\zyyjbfzcl.jpg");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -