java数字图像处理常用算法

一 读取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 byte[bfLen];
            fs.read(bf, 0, bfLen); // 读取14字节BMP文件头
            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) << 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, nWidth));

/*               
//调试数据的读取 

                FileWriter fw = new FileWriter("C:\\Documents and Settings\\Administrator\\My Documents\\nDataRaw.txt");//创建新文件
                PrintWriter out = new PrintWriter(fw);
                for(int j=0;j0.5?1:0);
      }
      return brightnessData;
     }
      
    }
       
三 直方图均衡化
    public int [] equilibrateGray(int[] PixelsGray,int width,int height) 
    {         
         int gray;
         int length=PixelsGray.length;
         int FrequenceGray[]=new int[length]; 
         int SumGray[]=new int[256]; 
         int ImageDestination[]=new int[length];
         for(int i = 0; i max)
        max=filterData[i*width+j];
      }  
     }
//     System.out.println("max: "+max);
//     System.out.println("min: "+min);
     
     for(int i=0;imax)
        max=filterData[i*width+j];
      }  
     }
     for(int i=0;ithreshold)
             processData[i]=255;
          else 
                processData[i]=0;
         }
      
         return processData;
       }
    }
    
八  垂直边缘检测,sobel算子
    public int[] verticleEdgeCheck(int []data,int width,int height,int sobelCoefficients) throws Exception{
     int filterData[]=new int[data.length];
     int min=10000;
     int max=-10000;
     if(data.length!=width*height)
      return filterData;
     
     try{
     
       for(int i=0;imax)
         max=filterData[i*width+j];
        }
        }
       for(int i=0;imax)
         max=filterData[i*width+j];
        }
        }
       for(int i=0;i

 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunny3106/archive/2007/07/08/1682813.aspx

你可能感兴趣的:(java)