java图像处理实例.docx_第1页
java图像处理实例.docx_第2页
java图像处理实例.docx_第3页
java图像处理实例.docx_第4页
java图像处理实例.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一 读取bmp图片数据/ 获取待检测图像,数据保存在数组 nData,nB,nG,nR中public void getBMPImage(String source) throws Exception clearNData(); /清除数据保存区 FileInputStream fs = null; try fs = new FileInputStream(source); int bfLen = 14; byte bf = new bytebfLen; fs.read(bf, 0, bfLen); / 读取14字节BMP文件头 int biLen = 40; byte bi = new bytebiLen; fs.read(bi, 0, biLen); / 读取40字节BMP信息头 / 源图宽度 nWidth = (int) bi7 & 0xff) 24) | (int) bi6 & 0xff) 16) | (int) bi5 & 0xff) 8) | (int) bi4 & 0xff; / 源图高度 nHeight = (int) bi11 & 0xff) 24) | (int) bi10 & 0xff) 16) | (int) bi9 & 0xff) 8) | (int) bi8 & 0xff; / 位数 nBitCount = (int) bi15 & 0xff) 8) | (int) bi14 & 0xff; / 源图大小 int nSizeImage = (int) bi23 & 0xff) 24) | (int) bi22 & 0xff) 16) | (int) bi21 & 0xff) 8) | (int) bi20 & 0xff; / 对24位BMP进行解析 if (nBitCount = 24) int nPad = (nSizeImage / nHeight) - nWidth * 3; nData = new intnHeight * nWidth; nB=new intnHeight * nWidth; nR=new intnHeight * nWidth; nG=new intnHeight * nWidth; byte bRGB = new byte(nWidth + nPad) * 3 * nHeight; fs.read(bRGB, 0, (nWidth + nPad) * 3 * nHeight); int nIndex = 0; for (int j = 0; j nHeight; j+) for (int i = 0; i nWidth; i+) nDatanWidth * (nHeight - j - 1) + i = (255 & 0xff) 24 | (int) bRGBnIndex + 2 & 0xff) 16) | (int) bRGBnIndex + 1 & 0xff) 8) | (int) bRGBnIndex & 0xff; nBnWidth * (nHeight - j - 1) + i=(int) bRGBnIndex& 0xff; nGnWidth * (nHeight - j - 1) + i=(int) bRGBnIndex+1& 0xff; nRnWidth * (nHeight - j - 1) + i=(int) bRGBnIndex+2& 0xff; nIndex += 3; nIndex += nPad; / Toolkit kit = Toolkit.getDefaultToolkit();/ image = kit.createImage(new MemoryImageSource(nWidth, nHeight,/ nData, 0, nWidth);/* /调试数据的读取 FileWriter fw = new FileWriter(C:/Documents and Settings/Administrator/My Documents/nDataRaw.txt);/创建新文件 PrintWriter out = new PrintWriter(fw); for(int j=0;jnHeight;j+) for(int i=0;inWidth;i+) out.print(65536*256+nDatanWidth * (nHeight - j - 1) + i)+_ +nRnWidth * (nHeight - j - 1) + i+_ +nGnWidth * (nHeight - j - 1) + i+_ +nBnWidth * (nHeight - j - 1) + i+ ); out.println(); out.close();*/ catch (Exception e) e.printStackTrace(); throw new Exception(e); finally if (fs != null) fs.close(); / return image; 二由r g b 获取灰度数组 public int getBrightnessData(int rData,int gData,int bData) int brightnessData=new intrData.length; if(rData.length!=gData.length | rData.length!=bData.length | bData.length!=gData.length) return brightnessData; else for(int i=0;i0.5?1:0); return brightnessData; 三 直方图均衡化 public int equilibrateGray(int PixelsGray,int width,int height) int gray; int length=PixelsGray.length; int FrequenceGray=new intlength; int SumGray=new int256; int ImageDestination=new intlength; for(int i = 0; i length ;i+) gray=PixelsGrayi; FrequenceGraygray+; / 灰度均衡化 SumGray0=FrequenceGray0; for(int i=1;i256;i+) SumGrayi=SumGrayi-1+FrequenceGrayi; for(int i=0;i256;i+) SumGrayi=(int)(SumGrayi*255/length); for(int i=0;iheight;i+) for(int j=0;jwidth;j+) int k=i*width+j; ImageDestinationk=0xFF000000 | (SumGrayPixelsGrayk 16 ) | (SumGrayPixelsGrayk 8 ) | SumGrayPixelsGrayk); return ImageDestination; 四 laplace2阶滤波,增强边缘,图像锐化 public int laplace2DFileter(int data,int width,int height) int filterData=new intdata.length; int min=10000; int max=-10000; for(int i=0;iheight;i+) for(int j=0;jwidth;j+) if(i=0 | i=height-1 | j=0 | j=width-1) filterDatai*width+j=datai*width+j; else filterDatai*width+j=9*datai*width+j-datai*width+j-1-datai*width+j+1 -data(i-1)*width+j-data(i-1)*width+j-1-data(i-1)*width+j+1 -data(i+1)*width+j-data(i+1)*width+j-1-data(i+1)*width+j+1; if(filterDatai*width+jmax) max=filterDatai*width+j; / System.out.println(max: +max);/ System.out.println(min: +min); for(int i=0;iwidth*height;i+) filterDatai=(filterDatai-min)*255/(max-min); return filterData; 五 laplace2阶增强滤波,增强边缘,增强系数delt public int laplaceHigh2DFileter(int data,int width,int height,double delt) int filterData=new intdata.length; int min=10000; int max=-10000; for(int i=0;iheight;i+) for(int j=0;jwidth;j+) if(i=0 | i=height-1 | j=0 | j=width-1) filterDatai*width+j=(int)(1+delt)*datai*width+j); else filterDatai*width+j=(int)(9+delt)*datai*width+j-datai*width+j-1)-datai*width+j+1 -data(i-1)*width+j-data(i-1)*width+j-1-data(i-1)*width+j+1 -data(i+1)*width+j-data(i+1)*width+j-1-data(i+1)*width+j+1; if(filterDatai*width+jmax) max=filterDatai*width+j; for(int i=0;iwidth*height;i+) filterDatai=(filterDatai-min)*255/(max-min); return filterData; 六 局部阈值处理2值化 / 局部阈值处理2值化,niblacks 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。 这个算法的优点是 速度快,效果好。 缺点是 niblacks method会产生一定的噪声。 */ public int localThresholdProcess(int data,int width,int height,int w,int h,double coefficients,double gate) int processData=new intdata.length; for(int i=0;idata.length;i+) processDatai=255; if(data.length!=width*height) return processData; int wNum=width/w; int hNum=height/h; int delt=new intw*h; /System.out.println(w; +w+ h:+h+ wNum:+wNum+ hNum:+hNum); for(int j=0;jhNum;j+) for(int i=0;iwNum;i+) /for(int j=0;j1;j+) /for(int i=0;i1;i+) for(int n=0;nh;n+) for(int k=0;kw;k+) deltn*w+k=data(j*h+n)*width+i*w+k; /System.out.print(delt+(n*w+k)+: +deltn*w+k+ ); /System.out.println(); /* for(int n=0;nh;n+) for(int k=0;kw;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;nh;n+) for(int k=0;kw;k+) processData(j*h+n)*width+i*w+k=deltn*w+k; / System.out.print(delt+(n*w+k)+: +deltn*w+k+ ); /System.out.println(); /* for(int n=0;nh;n+) for(int k=0;kw;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; 七 全局阈值处理2值化 public int thresholdProcess(int data,int width,int height,double coefficients,double gate) int processData=new intdata.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;iwidth*height;i+) sum+=datai; average=sum/(width*height); for(int i=0;iwidth*height;i+) variance+=(datai-average)*(datai-average); variance=Math.sqrt(variance); threshold=average-coefficients*variance; for(int i=0;ithreshold) processDatai=255; else processDatai=0; return processData; 八 垂直边缘检测,sobel算子 public int verticleEdgeCheck(int data,int width,int height,int sobelCoefficients) throws Exception int filterData=new intdata.length; int min=10000; int max=-10000; if(data.length!=width*height) return filterData; try for(int i=0;iheight;i+) for(int j=0;jwidth;j+) if(i=0 | i=1 | i=height-1 | i=height-2 |j=0 | j=1 | j=width-1 | j=width-2) filterDatai*width+j=datai*width+j; else double average; /中心的九个像素点 /average=datai*width+j-Math.sqrt(2)*datai*width+j-1+Math.sqrt(2)*datai*width+j+1 average=datai*width+j-sobelCoefficients*datai*width+j-1+sobelCoefficients*datai*width+j+1 -data(i-1)*width+j-1+data(i-1)*width+j+1 -data(i+1)*width+j-1+data(i+1)*width+j+1; filterDatai*width+j=(int)(average); if(filterDatai*width+jmax) max=filterDatai*width+j; for(int i=0;iwidth*height;i+) filterDatai=(filterDatai-min)*255/(max-min); catch (Exception e) e.printStackTrace(); throw new Exception(e); return filterData; 九 图像平滑:3*3掩模处理(平均处理),降低噪

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论