当前位置:
文档之家› JAVA数字图像处理常用算法
JAVA数字图像处理常用算法
nWidth)); /* //调试数据的读取 FileWriter fw = new FileWriter("C:\\Documents and Settings\\Administrator\\My Documents\\nDataRaw.txt");//创建新文件 PrintWriter out = new PrintWriter(fw); for(int j=0;j<nHeight;j++){ for(int i=0;i<nWidth;i++){ out.print((65536*256+nData [nWidth * (nHeight - j - 1) + i])+"_" +nR[nWidth * (nHeight j - 1) + i]+"_" +nG[nWidth * (nHeight j - 1) + i]+"_" +nB[nWidth * (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;
,nG[]
,
void getBMPImage(String source) throws Exception { clearNData(); //清除数据保存区 FileInputStream fs = null; try { fs = new FileInputStream(source); int bfLen = 14; byte bf[] = new byte[bfLen]; fs.read(bf, 0, bfLen); // 读取 14 字节 BMP
<< 8) | (int) bi[20] & 0xff; // 对 24 位 BMP 进行解析 if (nBitCount == 24){ int nPad = (nSizeImage / nHeight) - nWidth * 3; 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) * 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++) { nData[nWidth * (nHeight - j - 1) + i] = (255 & 0xff) << 24 | (((int) bRGB[nIndex + 2] & 0xff) << 16) | (((int) bRGB[nIndex + 1] & 0xff) << 8) | (int) bRGB[nIndex] & 0xff; nB[nWidth * (nHeight - j - 1) + i]=(int) bRGB[nIndex]& 0xff; nG[nWidth * (nHeight - j - 1) + i]=(int) bRGB[nIndex+1]& 0xff; nR[nWidth * (nHeight - j - 1) + i]=(int) bRGB[nIndex+2]& 0xff; nIndex += 3; } nIndex += nPad; } // Toolkit kit = Toolkit.getDefaultToolkit(); // image = kit.createImage(new MemoryImageSource(nWidth, nHeight, // nData, 0,
文件头 int biLen = 40; byte bi[] = new byte[biLen]; fs.read(bi, 0, biLen); // 读取 40 字节 BMP 信息头 // 源图宽度 nWidth = (((int) bi[7] & 0xff) << 24) | (((int) bi[6] & 0xff) << 16) | (((int) bi[5] & 0xff) << 8) | (int) bi[4] & 0xff; // 源图高度 nHeight = (((int) bi[11] & 0xff) << 24) | (((int) bi[10] & 0xff) << 16) | (((int) bi[9] & 0xff) << 8) | (int) bi[8] & 0xff; // 位数 nBitCount = (((int) bi[15] & 0xff) << 8) | (int) bi[14] & 0xff; // 源图大小 int nSizeImage = (((int) bi[23] & 0xff) << 24) | (((int) bi[22] & 0xff) << 16) | (((int) bi[21] & 0xff)
// } 二
由 r g b 获取灰度数组 int[] getBrightnessData(int rData[],int gData[],int
public bData[]){
int brightnessData[]=new int[rData.length]; if(rData.length!=gData.length || rData.length!=bData.length || bData.length!=gData.length){ return brightnessData; } else { for(int i=0;i<bData.length;i++){ double temp=0.3*rData[i]+0.59*gData[i]+0.11*bData[i]; brightnessData[i]=(int)(temp)+((temp-(int)(temp))>0.5 ?1:0); } return brightnessData; } }
四 laplace2 阶滤波,增强边缘,图像锐化
public int[] laplace2DFileter(int []data,int width,int height){
int filterData[]=new int[data.length]; int min=10000; int max=-10000; for(int i=0;i<height;i++){ for(int j=0;j<width;j++){ if(i==0 || i==height-1 || j==0 || j==width-1) filterData[i*width+j]=data[i*width+j]; else filterData[i*width+j]=9*data[i*width+j]-data[i*width+j-1]-data[i*width+j+1] -data[(i-1)*width+j]-data[(i-1)*width+j-1]-da ta[(i-1)*width+j+1] -data[(i+1)*width+j]-data[(i+1)*width+j-1]-da ta[(i+1)*width+j+1]; if(filterData[i*width+j]<min) min=filterData[i*width+j]; if(filterData[i*width+j]>max) max=filterData[i*width+j]; } } // System.out.println("max: "+max); // System.out.println("min: "+min); for(int i=0;i<width*height;i++){ filterData[i]=(filterData[i]-min)*255/(max-min); } return filterData; } 五 laplace2 阶增强滤波,增强边缘,增强系数 delt
public int[] laplaceHigh2DFileter(int []data,int width,int height,double delt){ int filterData[]=new int[data.length]; int min=10000; int max=-10000; for(int i=0;i<height;i++){ for(int j=0;j<width;j++){ if(i==0 || i==height-1 || j==0 || j==width-1) filterData[i*width+j]=(int)((1+delt)*data [i*width+j]); else filterData[i*width+j]=(int)((9+delt)*data[i*width+j]-d ata[i*width+j-1])-data[i*width+j+1] -data[(i-1)*w idth+j]-data[(i-1)*width+j-1]-data[(i-1)*width+j+1] -data[(i+1)*w idth+j]-data[(i+1)*width+j-1]-data[(i+1)*width+j+1]; 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=0;i<width*height;i++){ filterData[i]=(filterData[i]-min)*255/(max-min); } return filterData; }