`
lzj0470
  • 浏览: 1273055 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java数字图像处理常用算法

    博客分类:
  • 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;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;
    }

二 由r g b 获取灰度数组

    public  int[] getBrightnessData(int rData[],int gData[],int 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;
     }
      
    }
       
三 直方图均衡化
    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 <length ;i++) 
        { 
           gray=PixelsGray[i]; 
              FrequenceGray[gray]++; 
        } 
          //    灰度均衡化 
         SumGray[0]=FrequenceGray[0]; 
         for(int i=1;i<256;i++){
               SumGray[i]=SumGray[i-1]+FrequenceGray[i];  
         }
         for(int i=0;i<256;i++) {
               SumGray[i]=(int)(SumGray[i]*255/length);  
         }
         for(int i=0;i<height;i++) 
         { 
               for(int j=0;j<width;j++) 
              { 
                  int k=i*width+j; 
                  ImageDestination[k]=0xFF000000 | ((SumGray[PixelsGray[k]]<< 
                            16 ) | (SumGray[PixelsGray[k]]<< 8 ) | SumGray[PixelsGray[k]]); 
               } 
          }
         return ImageDestination;
      } 
    
四 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]-data[(i-1)*width+j+1]
                             -data[(i+1)*width+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];
      }  
     }
//     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]-data[i*width+j-1])-data[i*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(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;
    }
       
六 局部阈值处理2值化

    //   局部阈值处理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会产生一定的噪声。  
     */
    
    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;
    }
   
七 全局阈值处理2值化
    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;
       }
    }
    
八  垂直边缘检测,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;i<height;i++){
       for(int j=0;j<width;j++){
        if(i==0 || i==1 || i==height-1 || i==height-2 
           ||j==0 || j==1 || j==width-1 || j==width-2){
               filterData[i*width+j]=data[i*width+j];
         }
         else{
          double average;
            //中心的九个像素点
             //average=data[i*width+j]-Math.sqrt(2)*data[i*width+j-1]+Math.sqrt(2)*data[i*width+j+1]
          average=data[i*width+j]-sobelCoefficients*data[i*width+j-1]+sobelCoefficients*data[i*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];
             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=0;i<width*height;i++){
        filterData[i]=(filterData[i]-min)*255/(max-min);
         }
     
     }
     catch (Exception e) 
     {
            e.printStackTrace();
            throw new Exception(e);
        }  
     
     return filterData;
    }
    
       
九  图像平滑:3*3掩模处理(平均处理),降低噪声    
    public int[] filter(int []data,int width,int height) 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;i<height;i++){
       for(int j=0;j<width;j++){
        if(i==0 || i==1 || i==height-1 || i==height-2 
           ||j==0 || j==1 || j==width-1 || j==width-2){
               filterData[i*width+j]=data[i*width+j];
         }
         else{
          double average;
            //中心的九个像素点
             average=(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]+data[(i-1)*width+j+1]
                     +data[(i+1)*width+j]+data[(i+1)*width+j-1]+data[(i+1)*width+j+1])/9;
             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=0;i<width*height;i++){
        filterData[i]=(filterData[i]-min)*255/(max-min);
         }
     
     }
     catch (Exception e) 
     {
            e.printStackTrace();
            throw new Exception(e);
        }  
     
     return filterData;
    }




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

分享到:
评论

相关推荐

    JAVA数字图像处理常用算法.pdf

    本篇文档主要介绍如何使用Java语言来处理数字图像,特别是处理BMP格式的图像。以下是文档中提及的关键知识点: 1. BMP图像格式 BMP(Bitmap)是Windows操作系统中广泛使用的图像文件格式。它是一个无压缩的、...

    JAVA基本数字图像处理

    以上这些基本操作构成了Java数字图像处理的基础。通过理解这些概念和技巧,开发者可以进一步探索更复杂的图像处理技术,如边缘检测、特征提取、图像分割等。在实际应用中,Java的`java.awt`和`java.awt.image`包提供...

    数字图像处理-Java语言算法描述.zip

    在数字图像处理领域,Java语言由于其跨平台性、丰富的库支持和强大的性能,成为实现图像处理算法的常用工具。本资源"数字图像处理-Java语言算法描述.zip"包含了一系列关于如何使用Java来实现数字图像处理算法的详细...

    Java数字图像常用算法总集

    这只是Java数字图像处理的基础,其他常见的算法还包括: 1. **图像显示**:使用Java AWT或Swing库中的`BufferedImage`类和`Graphics`对象来绘制图像。 2. **颜色空间转换**:例如从RGB到HSV,或者从灰度到彩色。 3....

    数字图像处理java版源代码

    Java作为一种跨平台、面向对象的编程语言,是实现数字图像处理的常用工具之一。本项目"数字图像处理java版源代码"正是为初学者提供了一个良好的学习平台,通过清晰的代码结构和模块化设计,帮助学习者理解并实践数字...

    数字图像处理java

    在数字图像处理领域,Java是一种常用的编程语言,用于开发各种图像处理算法和应用。本项目主要涉及了几个关键的图像处理技术,包括直方图均衡化、中值滤波、对数变换、模糊处理、锐化、旋转和平移。下面将详细解释...

    数字图像处理-Java代码

    在数字图像处理领域,Java是一种常用的编程语言,其丰富的库和强大的面向对象特性使得它非常适合进行复杂的图像操作。本项目涵盖了图像处理的多个关键方面,包括图像增强、图像复原、图像编码与压缩以及图像分割与...

    基于Java技术的数字图像处理系统的开发.pdf

    一个基于Java技术的数字图像处理系统在稳定性和扩展性方面表现出色,通过使用Java技术开发,系统不仅能够提供实用的功能,而且能够方便地进行后期维护和功能扩展。特别是对于医学影像处理方面,该系统为后期的医学...

    数字图像处理:Java编程与实验

    《数字图像处理:Java编程与实验》是一本深入探讨数字图像处理技术的书籍,结合了理论与实践,特别强调了使用Java语言进行编程和实验。在这个领域,掌握基础理论、算法实现以及应用实践是至关重要的。以下是关于这个...

    java数字图像处理基础

    Java数字图像处理基础是计算机视觉领域的一个重要分支,它涉及到图像的获取、分析、操作以及显示等技术。在这个领域,Java作为一个广泛使用的编程语言,提供了丰富的库和工具,使得开发者可以方便地进行图像处理工作...

    用JAVA进行数字图像处理.pdf

    3. **图像处理算法**:数字图像处理中常用的算法包括灰度化、二值化、边缘检测等,Java中可以通过循环遍历像素数据并应用数学运算来实现这些算法。 #### 五、总结 通过上述内容的学习,我们了解到Java环境下进行...

    数字图像处理代码(内含完整的代码)

    这个压缩包提供的“数字图像处理代码(内含完整的代码)”很可能包含了一系列用于处理图像的算法实现,这对于我们理解和实践图像处理技术至关重要。以下是根据标题、描述和标签推测的一些可能包含的知识点: 1. **...

    数字图像处理 JAVA 边缘检测 图像增强

    在数字图像处理领域,JAVA是一种常用的编程语言,用于实现各种图像操作和分析。边缘检测和图像增强是两个关键的技术,它们对于图像的理解、分析和应用至关重要。本文将深入探讨这两个概念,以及它们在图像处理中的...

    Java常用数值算法集

    Java常用数值算法集是编程实践中不可或缺的一部分,它们涵盖了数学、统计学和计算机科学中的各种计算方法,用于解决实际问题。这些算法在处理数据、优化计算效率、模拟真实世界现象等方面发挥着重要作用。以下是一些...

    java 图像处理(模糊处理、锐化处理)

    在图像处理中,常用的锐化算法有拉普拉斯算子和Sobel算子。这些算子会检测像素间的梯度变化,从而突出图像的边缘。以下是一个使用Sobel算子进行锐化的Java实现: ```java public class Sharpen { public static ...

    数字图像处理 JAVA 边缘检测 图像增强 图像分割 平滑 有界面 图像变换

    在IT领域,数字图像处理是一项重要的技术,广泛应用于医学影像、遥感、计算机视觉和多媒体等领域。本项目基于JAVA语言,涵盖了多个关键的图像处理技术,包括边缘检测、图像增强、图像分割、平滑和图像变换,且具有...

    数字图像处理程序样品

    在数字图像处理中,我们通常使用编程语言如Python、C++或Java来实现算法。例如,Python的PIL库和OpenCV库是处理图像的常用工具,它们提供了丰富的函数来执行各种图像操作。理解编程基础,如变量、控制结构、函数和...

    基于Java语言和ImageJ平台的数字图像处理实验教学方案.pdf

    MATLAB是一款数学软件,广泛应用于工程计算、数据可视化、交互式算法开发等,同样适用于数字图像处理实验教学。MATLAB提供了一个交互式环境,内置了丰富的函数库和图像处理工具箱,这使得它在处理向量和矩阵时非常...

Global site tag (gtag.js) - Google Analytics