java 图片像素级操作

时间:2022-04-18 20:29:08

http://services.iteye.com/blog/230239

首先用matlab实现了识别算法的仿真,因为只是对特定的数字组合的识别,所以非常的简单,放弃采用比较复杂的识别算法,采用最普通的像素比较的识别算法。(如果背景噪声比较复杂,可以考虑先滤波后识别)在写java程序的时候发现一些问题,网上关于图片像素级操作的资料不是太多,有的还不是太正确,特此写出自己的成果与大家分享。 

核心类:BufferedImage,ImageIO 
ImageIO类提供图象读写接口,可以对URL,InputStream等操作,得到图像信息十分的方便。 
ImageIO在javax.imageio.*的包中,属于jdk中的标准类。提供的方法有: 
read()  例:BufferedImage imd=ImageIO.read(new File(file)); 
write() 例:ImageIO.write(imd, "JPEG", new File("C:\\test"+k+".gif")); 
//具体方法可以查找jdk doc 
BufferedImage类是一个Image类的子类,与Image不同的是,它是在内存中创建和修改的,你可以显示它也可以不显示它,这就看你的具体需求了。这里因为我用于图像的识别所以就不需要显示出来了。你可以通过ImageIO的方法来读取一个文件到BufferedImage,也可以将其写回一个文件中去。类似的操作可以看前面的两个方法。以及参考jdk doc 
因为我要识别类似于身份验证的一个数字串图片,所以我考虑把这些数字分离出来,存在不同的图像内,这里BufferedImage类提供一个很方便的办法。 
getSubimage(int left,int top,int width,int height) 
例:    BufferedImage newim[]=new BufferedImage[4]; 
newim[0]=imd.getSubimage(4,0,10,18); 
newim[1]=imd.getSubimage(13,0,10,18); 
newim[2]=imd.getSubimage(22,0,10,18); 
newim[3]=imd.getSubimage(31,0,10,18); 
最后为了得到图像的像素,我们需要的就是得到像素的方法,这个方法有很多,这里我介绍的是 
getRGB(int x,int y) 得到特定像素点的RGB值。 
例: pix=new int[10*18];pix[i*(10)+j]=newim[k].getRGB(j,i); 
现在我们得到了像素,可以看出像素是一个一维数组,你如果不习惯可以考虑保存在一个二维的数组中,然后就来实施你的看家算法,什么小波变换,拉普拉斯算子,尽管来吧。怎么样是不是很方便呢?什么你好像看不太懂,好给你一些源程序好了,包括像素分解和识别算法。 
Java代码  java 图片像素级操作
  1. import java.awt.*;  
  2. import java.awt.image.*;  
  3. import java.io.FileOutputStream;  
  4. import java.io.*;  
  5. import java.io.InputStream;  
  6. import java.net.URL;  
  7. import javax.imageio.*;  
  8. public class MyImage{  
  9.    BufferedImage imd;//待识别图像  
  10.    
  11.  private int iw,ih;//图像宽和高  
  12.    
  13.  public final static String path="D:\\jyy\\app\\tomcat\\webapps\\userlogon\\a.jpg";  
  14.   
  15.   static public void main(String args[]) {  
  16.    try{  
  17.    MyImage app = new MyImage();//构造一个类  
  18.      
  19.    String s=app.getImageNum("C:\\无标题.bmp");//得到识别字符串  
  20.    System.out.println("recognize result"+s);  
  21.    byte[] by=s.getBytes();  
  22.    File f=new File("C:\\testfile.txt");  
  23.    FileOutputStream fos=new FileOutputStream(f);//写入一个结果文件  
  24.    fos.write(by);  
  25.    fos.close();  
  26.    }catch(Exception e){  
  27.     e.printStackTrace();  
  28.    }  
  29.   }  
  30.   
  31.  //构造函数  
  32.   public MyImage() throws IOException {  
  33.      
  34.     super("Image Test");  
  35.     try{  
  36.     }catch(Exception e){  
  37.      e.printStackTrace();  
  38.     }   
  39.   }  
  40.  //得到图像的值  
  41.   public String getImageNum(String file){  
  42.      
  43.    StringBuffer sb=new StringBuffer("");  
  44.    try{  
  45.    imd=ImageIO.read(new File(file));//用ImageIO的静态方法读取图像  
  46.  BufferedImage newim[]=new BufferedImage[4];  
  47.  int []x=new int[4];  
  48.         //将图像分成四块,因为要处理的文件有四个数字。  
  49.  newim[0]=imd.getSubimage(4,0,10,18);  
  50.  newim[1]=imd.getSubimage(13,0,10,18);  
  51.  newim[2]=imd.getSubimage(22,0,10,18);  
  52.  newim[3]=imd.getSubimage(31,0,10,18);  
  53.    
  54.  for(int k=0;k<4;k++){  
  55.     
  56.   
  57.  x[k]=0;  
  58.   
  59.  ImageIO.write(newim[k], "JPEG"new File("C:\\test"+k+".gif"));  
  60.  this.iw=newim[k].getWidth(null);  
  61.  this.ih=newim[k].getHeight(null);  
  62.  pix=new int[iw*ih];  
  63.   
  64.  //因为是二值图像,这里的方法将像素读取出来的同时,转换为0,1的图像数组。  
  65.  for(int i=0;i<ih;i++){  
  66.   for(int j=0;j<iw;j++){  
  67.    pix[i*(iw)+j]=newim[k].getRGB(j,i);  
  68.    if(pix[i*(iw)+j]==-1)  
  69.     pix[i*(iw)+j]=0;  
  70.    else pix[i*(iw)+j]=1;  
  71.      
  72.    x[k]=x[k]+pix[i*(iw)+j];  
  73.   
  74.   }  
  75.   
  76.  }  
  77.  //得到像匹配的数字。  
  78.  int r=this.getMatchNum(pix);  
  79.  sb.append(r);  
  80.  System.out.println("x="+x[k]);  
  81.  }  
  82.    }catch(Exception e){  
  83.     e.printStackTrace();  
  84.    }  
  85.  return sb.toString();  
  86. }  
  87. //数字模板 0-9  
  88.   static  int[][] value={  
  89.    //num 0;  
  90.    {0,0,0,0,0,0,0,0,0,0,  
  91.     0,0,0,0,0,0,0,0,0,0,  
  92.  0,0,0,0,0,0,0,0,0,0,  
  93.  0,0,0,0,0,0,0,0,0,0,  
  94.  0,0,0,0,1,1,0,0,0,0,  
  95.  0,0,1,1,1,1,1,0,0,0,  
  96.  0,0,1,1,0,0,1,1,0,0,  
  97.  0,1,1,0,0,0,0,1,1,0,  
  98.  0,1,1,0,0,0,0,1,1,0,  
  99.  0,1,1,0,0,0,0,1,1,0,  
  100.  0,1,1,0,0,0,0,1,1,0,  
  101.  0,0,1,1,0,0,1,1,0,0,  
  102.  0,0,0,1,1,1,1,0,0,0,  
  103.  0,0,0,0,1,1,0,0,0,0,  
  104.  0,0,0,0,0,0,0,0,0,0,  
  105.  0,0,0,0,0,0,0,0,0,0,  
  106.  0,0,0,0,0,0,0,0,0,0,  
  107.  0,0,0,0,0,0,0,0,0,0  
  108.     },  
  109.    //num 1  
  110.    {0,0,0,0,0,0,0,0,0,0,  
  111.    0,0,0,0,0,0,0,0,0,0,  
  112.  0,0,0,0,0,0,0,0,0,0,  
  113.  0,0,0,0,0,0,0,0,0,0,  
  114.  0,0,0,0,0,1,1,0,0,0,  
  115.  0,0,0,0,1,1,1,0,0,0,  
  116.  0,0,0,1,1,1,1,0,0,0,  
  117.  0,0,0,0,0,1,1,0,0,0,  
  118.  0,0,0,0,0,1,1,0,0,0,  
  119.  0,0,0,0,0,1,1,0,0,0,  
  120.  0,0,0,0,0,1,1,0,0,0,  
  121.  0,0,0,0,0,1,1,0,0,0,  
  122.  0,0,0,0,0,1,1,0,0,0,  
  123.  1,1,1,1,1,1,1,1,1,0,  
  124.  0,0,0,0,0,0,0,0,0,0,  
  125.  0,0,0,0,0,0,0,0,0,0,  
  126.  0,0,0,0,0,0,0,0,0,0,  
  127.  0,0,0,0,0,0,0,0,0,0  
  128.  },  
  129.  //num2   
  130.  {  
  131.  0,0,0,0,0,0,0,0,0,0,  
  132.  0,0,0,0,0,0,0,0,0,0,  
  133.  0,0,0,0,0,0,0,0,0,0,  
  134.  0,0,0,0,0,0,0,0,0,0,  
  135.  0,0,0,1,1,1,1,0,0,0,  
  136.  0,0,1,1,0,0,1,1,0,0,  
  137.  0,1,1,0,0,0,0,1,1,0,  
  138.  0,0,0,0,0,0,0,1,1,0,  
  139.  0,0,0,0,0,0,1,1,0,0,  
  140.  0,0,0,0,0,1,1,0,0,0,  
  141.  0,0,0,0,1,1,0,0,0,0,  
  142.  0,0,0,1,1,0,0,0,0,0,  
  143.  0,0,1,1,0,0,0,0,0,0,  
  144.  1,1,1,1,1,1,1,1,1,0,  
  145.  0,0,0,0,0,0,0,0,0,0,  
  146.  0,0,0,0,0,0,0,0,0,0,  
  147.  0,0,0,0,0,0,0,0,0,0,  
  148.  0,0,0,0,0,0,0,0,0,0  
  149.  },  
  150.  //num3  
  151.  {  
  152.  0,0,0,0,0,0,0,0,0,0,  
  153.  0,0,0,0,0,0,0,0,0,0,  
  154.  0,0,0,0,0,0,0,0,0,0,  
  155.  0,0,0,0,0,0,0,0,0,0,  
  156.  0,0,1,1,1,1,1,0,0,0,  
  157.  0,1,1,0,0,0,1,1,0,0,  
  158.  0,0,0,0,0,0,0,1,1,0,  
  159.  0,0,0,0,0,0,1,1,0,0,  
  160.  0,0,0,0,1,1,1,0,0,0,  
  161.  0,0,0,0,0,0,1,1,0,0,  
  162.  0,0,0,0,1,0,0,1,1,0,  
  163.  0,0,0,0,0,0,0,1,1,0,  
  164.  0,1,1,0,0,0,1,1,0,0,  
  165.  0,0,1,1,1,1,1,0,0,0,  
  166.  0,0,0,1,0,0,0,0,0,0,  
  167.  0,0,0,0,0,0,0,0,0,0,  
  168.  0,0,0,0,0,0,0,0,0,0,  
  169.  0,0,0,0,0,0,0,0,0,0  
  170.  },  
  171.  //num4  
  172.  {  
  173.  0,0,0,0,0,0,0,0,0,0,  
  174.  0,0,0,0,0,0,0,0,0,0,  
  175.  0,0,0,0,0,0,0,0,0,0,  
  176.  0,0,0,0,0,0,0,0,0,0,  
  177.  0,0,0,0,0,0,1,1,0,0,  
  178.  0,0,0,0,0,1,1,1,0,0,  
  179.  0,0,0,0,1,1,1,1,0,0,  
  180.  0,0,0,1,1,0,1,1,0,0,  
  181.  0,0,1,1,0,0,1,1,0,0,  
  182.  0,1,1,0,0,0,1,1,0,0,  
  183.  0,1,1,1,1,1,1,1,1,0,  
  184.  0,0,0,0,0,0,1,1,0,0,  
  185.  0,0,0,0,0,0,1,1,0,0,  
  186.  0,0,0,0,0,0,1,1,0,0,  
  187.  0,0,0,0,0,0,0,0,0,0,  
  188.  0,0,0,0,0,0,0,0,0,0,  
  189.  0,0,0,0,0,0,0,0,0,0,  
  190.  0,0,0,0,0,0,0,0,0,0  
  191.  },  
  192.  //num5  
  193.  {  
  194.  0,0,0,0,0,0,0,0,0,0,  
  195.  0,0,0,0,0,0,0,0,0,0,  
  196.  0,0,0,0,0,0,0,0,0,0,  
  197.  0,0,0,0,1,0,0,0,0,0,  
  198.  0,1,1,1,1,1,1,1,0,0,  
  199.  0,1,1,0,0,0,0,0,0,0,  
  200.  0,1,1,0,0,0,0,0,0,0,  
  201.  0,1,1,0,1,1,1,0,0,0,  
  202.  0,1,1,1,0,0,1,1,0,0,  
  203.  0,0,0,0,0,0,0,1,1,0,  
  204.  0,0,0,0,0,0,0,1,1,0,  
  205.  0,1,1,0,0,0,0,1,1,0,  
  206.  0,0,1,1,0,0,1,1,0,0,  
  207.  0,0,0,1,1,1,1,0,0,0,  
  208.  0,0,0,0,0,0,0,0,0,0,  
  209.  0,0,0,0,0,0,0,0,0,0,  
  210.  0,0,0,0,0,0,0,0,0,0,  
  211.  0,0,0,0,0,0,0,0,0,0  
  212.  },  
  213.  //num6  
  214.  {  
  215.  0,0,0,0,0,0,0,0,0,0,  
  216.  0,0,0,0,0,0,0,0,0,0,  
  217.  0,0,0,0,0,0,0,0,0,0,  
  218.  0,0,0,0,0,0,0,0,0,0,  
  219.  0,0,0,1,1,1,1,0,0,0,  
  220.  0,0,1,1,0,0,1,1,0,0,  
  221.  0,1,1,0,0,0,0,1,0,0,  
  222.  0,1,1,0,0,0,0,0,0,0,  
  223.  0,1,1,0,1,1,1,0,0,0,  
  224.  0,1,1,1,0,0,1,1,0,0,  
  225.  0,1,1,0,0,0,0,1,1,0,  
  226.  0,1,1,0,0,0,0,1,1,0,  
  227.  0,0,1,1,0,0,1,1,0,0,  
  228.  0,0,0,1,1,1,1,0,0,0,  
  229.  0,0,0,0,0,0,0,0,0,0,  
  230.  0,0,0,0,0,0,0,0,0,0,  
  231.  0,0,0,0,0,0,0,0,0,0,  
  232.  0,0,0,0,0,0,0,0,0,0  
  233.  },  
  234.  //num7  
  235.  {  
  236.  0,0,0,0,0,0,0,0,0,0,  
  237.  0,0,0,0,0,0,0,0,0,0,  
  238.  0,0,0,0,0,0,0,0,0,0,  
  239.  0,0,0,0,0,0,0,0,0,0,  
  240.  0,1,1,1,1,1,1,1,1,0,  
  241.  0,0,0,0,0,0,0,1,1,0,  
  242.  0,0,0,0,0,0,1,1,1,0,  
  243.  0,0,0,0,0,0,1,1,0,0,  
  244.  0,0,0,0,1,1,1,0,0,0,  
  245.  0,0,0,0,1,1,0,0,0,0,  
  246.  0,0,0,1,1,0,0,0,0,0,  
  247.  0,0,1,1,0,0,0,0,0,0,  
  248.  0,1,1,0,0,0,0,0,0,0,  
  249.  0,1,1,0,0,0,0,0,0,0,  
  250.  0,0,0,0,0,0,0,0,0,0,  
  251.  0,0,0,0,0,0,0,0,0,0,  
  252.  0,0,0,0,0,0,0,0,0,0,  
  253.  0,0,0,0,0,0,0,0,0,0  
  254.  },  
  255.  //num8  
  256.  {  
  257.  0,0,0,0,0,0,0,0,0,0,  
  258.  0,0,0,0,0,0,0,0,0,0,  
  259.  0,0,0,0,0,0,0,0,0,0,  
  260.  0,0,0,0,0,0,0,0,0,0,  
  261.  0,0,0,1,1,1,1,0,0,0,  
  262.  0,0,1,1,0,0,1,1,1,0,  
  263.  0,1,1,0,0,0,0,1,1,0,  
  264.  0,0,1,1,0,1,1,1,1,0,  
  265.  0,0,0,1,1,1,1,0,0,0,  
  266.  0,0,1,1,0,0,1,1,0,0,  
  267.  0,1,1,0,0,0,0,1,1,0,  
  268.  0,1,1,0,0,0,0,1,1,0,  
  269.  0,0,1,1,0,0,1,1,0,0,  
  270.  0,0,0,1,1,1,1,0,0,0,  
  271.  0,0,0,0,0,0,0,0,0,0,  
  272.  0,0,0,0,0,0,0,0,0,0,  
  273.  0,0,0,0,0,0,0,0,0,0,  
  274.  0,0,0,0,0,0,0,0,0,0  
  275.  },  
  276.  //num9  
  277.  {  
  278.  0,0,0,0,0,0,0,0,0,0,  
  279.  0,0,0,0,0,0,0,0,0,0,  
  280.  0,0,0,0,0,0,0,0,0,0,  
  281.  0,0,0,0,0,0,0,0,0,0,  
  282.  0,0,0,1,1,1,1,0,0,0,  
  283.  0,0,1,1,0,1,1,1,0,0,  
  284.  0,1,1,0,0,0,0,1,1,0,  
  285.  0,1,1,0,0,0,0,1,1,0,  
  286.  0,0,1,1,0,0,1,1,1,0,  
  287.  0,0,0,1,1,1,0,1,1,0,  
  288.  0,0,0,0,0,0,0,1,1,0,  
  289.  0,0,1,0,0,0,0,1,1,0,  
  290.  0,0,1,1,0,0,1,1,0,0,  
  291.  0,0,0,1,1,1,1,0,0,0,  
  292.  0,0,0,0,0,0,0,0,0,0,  
  293.  0,0,0,0,0,0,0,0,0,0,  
  294.  0,0,0,0,0,0,0,0,0,0,  
  295.  0,0,0,0,0,0,0,0,0,0  
  296.  }};  
  297.     
  298.    
  299.   //图像像素相减取绝对值得到最小熵的结果。  
  300.   public int getMatchNum(int[] pix){  
  301.    int result=-1;  
  302.    int temp=100;  
  303.    int x;  
  304.    for(int k=0;k<=9;k++){  
  305.      x=0;  
  306.     for(int i=0;i<pix.length;i++){  
  307.      x=x+Math.abs(pix[i]-value[k][i]);   
  308.       
  309.     }  
  310.     /*for(int a=0;a<18;a++){ 
  311.      for(int b=0;b<10;b++){ 
  312.       System.out.print(pix[a*10+b]+"-"+value[k][a*10+b]+"|");  
  313.       
  314.      } 
  315.      System.out.println(); 
  316.      
  317.     }*/  
  318.       
  319.     if(x<temp)  
  320.     {  
  321.      temp=x;  
  322.      result=k;  
  323.     }  
  324.       
  325.    }  
  326.     
  327.    return result;  
  328.   }  
  329.     
  330.   
http://www.cnblogs.com/liyunqi007/archive/2011/11/23/2260052.html java图片处理工具类