java

位置:IT落伍者 >> java >> 浏览文章

java数字图像处理常用算法


发布日期:2022年07月12日
 
java数字图像处理常用算法
前些时候做毕业设计用java做的数字图像处理方面的东西这方面的资料ms比较少发点东西上来大家共享一下主要就是些算法有自己写的有人家的还有改人家的有的算法写的不好大家不要见笑

一 读取bmp图片数据

         

// 获取待检测图像数据保存在数组 nData[]nB[]nG[]nR[]中

public void getBMPImage(String source) throws Exception {

clearNData(); //清除数据保存区

FileInputStream fs = null;

try {

fs = new FileInputStream(source);

int bfLen = ;

byte bf[] = new byte[bfLen];

fsread(bf bfLen); // 读取字节BMP文件头

int biLen = ;

byte bi[] = new byte[biLen];

fsread(bi biLen); // 读取字节BMP信息头

// 源图宽度

nWidth = (((int) bi[] & xff) << )

| (((int) bi[] & xff) << )

| (((int) bi[] & xff) << ) | (int) bi[] & xff;

// 源图高度

nHeight = (((int) bi[] & xff) << )

| (((int) bi[] & xff) << )

| (((int) bi[] & xff) << ) | (int) bi[] & xff;

// 位数

nBitCount = (((int) bi[] & xff) << ) | (int) bi[] & xff;

// 源图大小

int nSizeImage = (((int) bi[] & xff) << )

| (((int) bi[] & xff) << )

| (((int) bi[] & xff) << ) | (int) bi[] & xff;

// 对位BMP进行解析

if (nBitCount == ){

int nPad = (nSizeImage / nHeight) nWidth * ;

nData = new int[nHeight * nWidth];

nB=new int[nHeight * nWidth];

nR=new int[nHeight * nWidth];

nG=new int[nHeight * nWidth];

byte bRGB[] = new byte[(nWidth + nPad) * * nHeight];

fsread(bRGB (nWidth + nPad) * * nHeight);

int nIndex = ;

for (int j = ; j < nHeight; j++){

for (int i = ; i < nWidth; i++) {

nData[nWidth * (nHeight j ) + i] = ( & xff) <<

| (((int) bRGB[nIndex + ] & xff) << )

| (((int) bRGB[nIndex + ] & xff) << )

| (int) bRGB[nIndex] & xff;

nB[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex]& xff;

nG[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+]& xff;

nR[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+]& xff;

nIndex += ;

}

nIndex += nPad;

}

// Toolkit kit = ToolkitgetDefaultToolkit();

// image = kitcreateImage(new MemoryImageSource(nWidth nHeight

// nData nWidth));

/*

//调试数据的读取

      

FileWriter fw = new FileWriter(C:\\Documents and Settings\\Administrator\\My Documents\\nDataRawtxt);//创建新文件

PrintWriter out = new PrintWriter(fw);

for(int j=;j<nHeight;j++){

for(int i=;i<nWidth;i++){

outprint((*+nData[nWidth * (nHeight j ) + i])+_

+nR[nWidth * (nHeight j ) + i]+_

+nG[nWidth * (nHeight j ) + i]+_

+nB[nWidth * (nHeight j ) + i]+ );

}

outprintln();

}

outclose();

*/

}

}

catch (Exception e) {

eprintStackTrace();

throw new Exception(e);

}

finally {

if (fs != null) {

fsclose();

}

}

// return image;

}

      


二由r g b 获取灰度数组

           public int[] getBrightnessData(int rData[]int gData[]int bData[]){

int brightnessData[]=new int[rDatalength];

if(rDatalength!=gDatalength || rDatalength!=bDatalength

|| bDatalength!=gDatalength){

return brightnessData;

}

else {

for(int i=;i<bDatalength;i++){

double temp=*rData[i]+*gData[i]+*bData[i];

brightnessData[i]=(int)(temp)+((temp(int)(temp))>?:);

}

return brightnessData;

}

  

}      

三 直方图均衡化

           public int [] equilibrateGray(int[] PixelsGrayint widthint height)

{

int gray;

int length=PixelsGraylength;

int FrequenceGray[]=new int[length];

int SumGray[]=new int[];

int ImageDestination[]=new int[length];

for(int i = ; i <length ;i++)

{

  gray=PixelsGray[i];

FrequenceGray[gray]++;

}

// 灰度均衡化

SumGray[]=FrequenceGray[];

for(int i=;i<;i++){

SumGray[i]=SumGray[i]+FrequenceGray[i];

}

for(int i=;i<;i++) {

SumGray[i]=(int)(SumGray[i]*/length);

}

for(int i=;i<height;i++)

{

for(int j=;j<width;j++)

{

int k=i*width+j;

ImageDestination[k]=xFF | ((SumGray[PixelsGray[k]]<<

) | (SumGray[PixelsGray[k]]<< ) | SumGray[PixelsGray[k]]);

}

}

return ImageDestination;

}      

四 laplace阶滤波增强边缘图像锐化

           public int[] laplaceDFileter(int []dataint widthint height){

int filterData[]=new int[datalength];

int min=;

int max=;

for(int i=;i<height;i++){

for(int j=;j<width;j++){

if(i== || i==height || j== || j==width)

  filterData[i*width+j]=data[i*width+j];

else

filterData[i*width+j]=*data[i*width+j]data[i*width+j]data[i*width+j+]

  data[(i)*width+j]data[(i)*width+j]data[(i)*width+j+]

  data[(i+)*width+j]data[(i+)*width+j]data[(i+)*width+j+];

if(filterData[i*width+j]<min)

min=filterData[i*width+j];

if(filterData[i*width+j]>max)

max=filterData[i*width+j];

}

}

// Systemoutprintln(max: +max);

// Systemoutprintln(min: +min);

for(int i=;i<width*height;i++){

filterData[i]=(filterData[i]min)*/(maxmin);

}

return filterData;

}      


五 laplace阶增强滤波增强边缘增强系数delt

           public int[] laplaceHighDFileter(int []dataint widthint heightdouble delt){

int filterData[]=new int[datalength];

int min=;

int max=;

for(int i=;i<height;i++){

for(int j=;j<width;j++){

if(i== || i==height || j== || j==width)

  filterData[i*width+j]=(int)((+delt)*data[i*width+j]);

else

filterData[i*width+j]=(int)((+delt)*data[i*width+j]data[i*width+j])data[i*width+j+]

  data[(i)*width+j]data[(i)*width+j]data[(i)*width+j+]

  data[(i+)*width+j]data[(i+)*width+j]data[(i+)*width+j+];

if(filterData[i*width+j]<min)

min=filterData[i*width+j];

if(filterData[i*width+j]>max)

max=filterData[i*width+j];

}

}

for(int i=;i<width*height;i++){

filterData[i]=(filterData[i]min)*/(maxmin);

}

return filterData;

}      

六 局部阈值处理值化

           // 局部阈值处理值化niblacks method

/*原理

T(xy)=m(xy) + k*s(xy)

取一个宽度为w的矩形框(xy)为这个框的中心

统计框内数据T(xy)为阈值m(xy)为均值s(xy)为均方差k为参数(推荐)计算出t再对(xy)进行切割/

这个算法的优点是 速度快效果好

缺点是 niblacks method会产生一定的噪声

*/

public int[] localThresholdProcess(int []dataint widthint heightint wint hdouble coefficientsdouble gate){

int[] processData=new int[datalength];

for(int i=;i<datalength;i++){

processData[i]=;

}

if(datalength!=width*height)

return processData;

int wNum=width/w;

int hNum=height/h;

int delt[]=new int[w*h];

//Systemoutprintln(w; +w+ h:+h+ wNum:+wNum+ hNum:+hNum);

for(int j=;j<hNum;j++){

for(int i=;i<wNum;i++){

//for(int j=;j<;j++){

//for(int i=;i<;i++){

  for(int n=;n<h;n++)

  for(int k=;k<w;k++){

   delt[n*w+k]=data[(j*h+n)*width+i*w+k];

   //Systemoutprint(delt[+(n*w+k)+]: +delt[n*w+k]+ );

  }

  //Systemoutprintln();

  /*

  for(int n=;n<h;n++)

  for(int k=;k<w;k++){

   Systemoutprint(data[+((j*h+n)*width+i*w+k)+]: +data[(j*h+n)*width+i*w+k]+ );

  }

  Systemoutprintln();

  */

  delt=thresholdProcess(deltwhcoefficientsgate);

  for(int n=;n<h;n++)

  for(int k=;k<w;k++){

   processData[(j*h+n)*width+i*w+k]=delt[n*w+k];

   // Systemoutprint(delt[+(n*w+k)+]: +delt[n*w+k]+ );

  }

  //Systemoutprintln();

  /*

  for(int n=;n<h;n++)

  for(int k=;k<w;k++){

   Systemoutprint(processData[+((j*h+n)*width+i*w+k)+]: +processData[(j*h+n)*width+i*w+k]+ );

  }

  Systemoutprintln();

  */

}

}

return processData;

}      

七 全局阈值处理值化

           public int[] thresholdProcess(int []dataint widthint heightdouble coefficientsdouble gate){

int [] processData=new int[datalength];

if(datalength!=width*height)

return processData;

else{

double sum=;

double average=;

double variance=;

double threshold;

if( gate!=){

threshold=gate;

}

else{

  for(int i=;i<width*height;i++){

   sum+=data[i];

  }

  average=sum/(width*height);

  for(int i=;i<width*height;i++){

   variance+=(data[i]average)*(data[i]average);

  }

  variance=Mathsqrt(variance);

  threshold=averagecoefficients*variance;

}

  for(int i=;i<width*height;i++){

  if(data[i]>threshold)

   processData[i]=;

  else

   processData[i]=;

  }

  return processData;

}

}      


八 垂直边缘检测sobel算子

           public int[] verticleEdgeCheck(int []dataint widthint heightint sobelCoefficients) throws Exception{

int filterData[]=new int[datalength];

int min=;

int max=;

if(datalength!=width*height)

return filterData;

try{

  for(int i=;i<height;i++){

  for(int j=;j<width;j++){

  if(i== || i== || i==height || i==height

  ||j== || j== || j==width || j==width){

  filterData[i*width+j]=data[i*width+j];

  }

  else{

  double average;

  //中心的九个像素点

  //average=data[i*width+j]Mathsqrt()*data[i*width+j]+Mathsqrt()*data[i*width+j+]

  average=data[i*width+j]sobelCoefficients*data[i*width+j]+sobelCoefficients*data[i*width+j+]

  data[(i)*width+j]+data[(i)*width+j+]

  data[(i+)*width+j]+data[(i+)*width+j+];

  filterData[i*width+j]=(int)(average);

  }  

  if(filterData[i*width+j]<min)

min=filterData[i*width+j];

  if(filterData[i*width+j]>max)

max=filterData[i*width+j];

  }

  }

  for(int i=;i<width*height;i++){

filterData[i]=(filterData[i]min)*/(maxmin);

  }

}

catch (Exception e)

{

eprintStackTrace();

throw new Exception(e);

}

return filterData;

}      

九 图像平滑*掩模处理(平均处理)降低噪声

           public int[] filter(int []dataint widthint height) throws Exception{

int filterData[]=new int[datalength];

int min=;

int max=;

if(datalength!=width*height)

return filterData;

try{

  for(int i=;i<height;i++){

  for(int j=;j<width;j++){

  if(i== || i== || i==height || i==height

  ||j== || j== || j==width || j==width){

  filterData[i*width+j]=data[i*width+j];

  }

  else{

  double average;

  //中心的九个像素点

  average=(data[i*width+j]+data[i*width+j]+data[i*width+j+]

  +data[(i)*width+j]+data[(i)*width+j]+data[(i)*width+j+]

  +data[(i+)*width+j]+data[(i+)*width+j]+data[(i+)*width+j+])/;

  filterData[i*width+j]=(int)(average);

  }  

  if(filterData[i*width+j]<min)

min=filterData[i*width+j];

  if(filterData[i*width+j]>max)

max=filterData[i*width+j];

  }

  }

  for(int i=;i<width*height;i++){

filterData[i]=(filterData[i]min)*/(maxmin);

  }

}

catch (Exception e)

{

eprintStackTrace();

throw new Exception(e);

}

return filterData;

}      

               

上一篇:Java中使用正则表达式验证本地化数据

下一篇:Flex和Java快速开发的Flamingo项目