`
services
  • 浏览: 78326 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

java 图片像素级操作

    博客分类:
  • java
阅读更多
首先用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);
现在我们得到了像素,可以看出像素是一个一维数组,你如果不习惯可以考虑保存在一个二维的数组中,然后就来实施你的看家算法,什么小波变换,拉普拉斯算子,尽管来吧。怎么样是不是很方便呢?什么你好像看不太懂,好给你一些源程序好了,包括像素分解和识别算法。
import java.awt.*;
import java.awt.image.*;
import java.io.FileOutputStream;
import java.io.*;
import java.io.InputStream;
import java.net.URL;
import javax.imageio.*;
public class MyImage{
   BufferedImage imd;//待识别图像
 
 private int iw,ih;//图像宽和高
 
 public final static String path="D:\\jyy\\app\\tomcat\\webapps\\userlogon\\a.jpg";

  static public void main(String args[]) {
   try{
   MyImage app = new MyImage();//构造一个类
   
   String s=app.getImageNum("C:\\无标题.bmp");//得到识别字符串
   System.out.println("recognize result"+s);
   byte[] by=s.getBytes();
   File f=new File("C:\\testfile.txt");
   FileOutputStream fos=new FileOutputStream(f);//写入一个结果文件
   fos.write(by);
   fos.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }

 //构造函数
  public MyImage() throws IOException {
   
    super("Image Test");
    try{
    }catch(Exception e){
     e.printStackTrace();
    } 
  }
 //得到图像的值
  public String getImageNum(String file){
   
   StringBuffer sb=new StringBuffer("");
   try{
   imd=ImageIO.read(new File(file));//用ImageIO的静态方法读取图像
 BufferedImage newim[]=new BufferedImage[4];
 int []x=new int[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);
 
 for(int k=0;k<4;k++){
  

 x[k]=0;

 ImageIO.write(newim[k], "JPEG", new File("C:\\test"+k+".gif"));
 this.iw=newim[k].getWidth(null);
 this.ih=newim[k].getHeight(null);
 pix=new int[iw*ih];

 //因为是二值图像,这里的方法将像素读取出来的同时,转换为0,1的图像数组。
 for(int i=0;i<ih;i++){
  for(int j=0;j<iw;j++){
   pix[i*(iw)+j]=newim[k].getRGB(j,i);
   if(pix[i*(iw)+j]==-1)
    pix[i*(iw)+j]=0;
   else pix[i*(iw)+j]=1;
   
   x[k]=x[k]+pix[i*(iw)+j];

  }

 }
 //得到像匹配的数字。
 int r=this.getMatchNum(pix);
 sb.append(r);
 System.out.println("x="+x[k]);
 }
   }catch(Exception e){
    e.printStackTrace();
   }
 return sb.toString();
}
//数字模板 0-9
  static  int[][] value={
   //num 0;
   {0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,1,1,0,0,0,0,
 0,0,1,1,1,1,1,0,0,0,
 0,0,1,1,0,0,1,1,0,0,
 0,1,1,0,0,0,0,1,1,0,
 0,1,1,0,0,0,0,1,1,0,
 0,1,1,0,0,0,0,1,1,0,
 0,1,1,0,0,0,0,1,1,0,
 0,0,1,1,0,0,1,1,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,0,0,1,1,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
    },
   //num 1
   {0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,1,1,0,0,0,
 0,0,0,0,1,1,1,0,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,0,0,0,1,1,0,0,0,
 0,0,0,0,0,1,1,0,0,0,
 0,0,0,0,0,1,1,0,0,0,
 0,0,0,0,0,1,1,0,0,0,
 0,0,0,0,0,1,1,0,0,0,
 0,0,0,0,0,1,1,0,0,0,
 1,1,1,1,1,1,1,1,1,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 },
 //num2 
 {
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,1,1,0,0,1,1,0,0,
 0,1,1,0,0,0,0,1,1,0,
 0,0,0,0,0,0,0,1,1,0,
 0,0,0,0,0,0,1,1,0,0,
 0,0,0,0,0,1,1,0,0,0,
 0,0,0,0,1,1,0,0,0,0,
 0,0,0,1,1,0,0,0,0,0,
 0,0,1,1,0,0,0,0,0,0,
 1,1,1,1,1,1,1,1,1,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 },
 //num3
 {
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,1,1,1,1,1,0,0,0,
 0,1,1,0,0,0,1,1,0,0,
 0,0,0,0,0,0,0,1,1,0,
 0,0,0,0,0,0,1,1,0,0,
 0,0,0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,1,1,0,0,
 0,0,0,0,1,0,0,1,1,0,
 0,0,0,0,0,0,0,1,1,0,
 0,1,1,0,0,0,1,1,0,0,
 0,0,1,1,1,1,1,0,0,0,
 0,0,0,1,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 },
 //num4
 {
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,1,1,0,0,
 0,0,0,0,0,1,1,1,0,0,
 0,0,0,0,1,1,1,1,0,0,
 0,0,0,1,1,0,1,1,0,0,
 0,0,1,1,0,0,1,1,0,0,
 0,1,1,0,0,0,1,1,0,0,
 0,1,1,1,1,1,1,1,1,0,
 0,0,0,0,0,0,1,1,0,0,
 0,0,0,0,0,0,1,1,0,0,
 0,0,0,0,0,0,1,1,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 },
 //num5
 {
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,1,0,0,0,0,0,
 0,1,1,1,1,1,1,1,0,0,
 0,1,1,0,0,0,0,0,0,0,
 0,1,1,0,0,0,0,0,0,0,
 0,1,1,0,1,1,1,0,0,0,
 0,1,1,1,0,0,1,1,0,0,
 0,0,0,0,0,0,0,1,1,0,
 0,0,0,0,0,0,0,1,1,0,
 0,1,1,0,0,0,0,1,1,0,
 0,0,1,1,0,0,1,1,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 },
 //num6
 {
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,1,1,0,0,1,1,0,0,
 0,1,1,0,0,0,0,1,0,0,
 0,1,1,0,0,0,0,0,0,0,
 0,1,1,0,1,1,1,0,0,0,
 0,1,1,1,0,0,1,1,0,0,
 0,1,1,0,0,0,0,1,1,0,
 0,1,1,0,0,0,0,1,1,0,
 0,0,1,1,0,0,1,1,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 },
 //num7
 {
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,1,1,1,1,1,1,1,1,0,
 0,0,0,0,0,0,0,1,1,0,
 0,0,0,0,0,0,1,1,1,0,
 0,0,0,0,0,0,1,1,0,0,
 0,0,0,0,1,1,1,0,0,0,
 0,0,0,0,1,1,0,0,0,0,
 0,0,0,1,1,0,0,0,0,0,
 0,0,1,1,0,0,0,0,0,0,
 0,1,1,0,0,0,0,0,0,0,
 0,1,1,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 },
 //num8
 {
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,1,1,0,0,1,1,1,0,
 0,1,1,0,0,0,0,1,1,0,
 0,0,1,1,0,1,1,1,1,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,1,1,0,0,1,1,0,0,
 0,1,1,0,0,0,0,1,1,0,
 0,1,1,0,0,0,0,1,1,0,
 0,0,1,1,0,0,1,1,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 },
 //num9
 {
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,1,1,0,1,1,1,0,0,
 0,1,1,0,0,0,0,1,1,0,
 0,1,1,0,0,0,0,1,1,0,
 0,0,1,1,0,0,1,1,1,0,
 0,0,0,1,1,1,0,1,1,0,
 0,0,0,0,0,0,0,1,1,0,
 0,0,1,0,0,0,0,1,1,0,
 0,0,1,1,0,0,1,1,0,0,
 0,0,0,1,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0
 }};
  
 
  //图像像素相减取绝对值得到最小熵的结果。
  public int getMatchNum(int[] pix){
   int result=-1;
   int temp=100;
   int x;
   for(int k=0;k<=9;k++){
     x=0;
    for(int i=0;i<pix.length;i++){
     x=x+Math.abs(pix[i]-value[k][i]); 
    
    }
    /*for(int a=0;a<18;a++){
     for(int b=0;b<10;b++){
      System.out.print(pix[a*10+b]+"-"+value[k][a*10+b]+"|"); 
     
     }
     System.out.println();
    
    }*/
    
    if(x<temp)
    {
     temp=x;
     result=k;
    }
    
   }
  
   return result;
  }
  

}
分享到:
评论
1 楼 xgene 2008-09-09  
要是字符做了旋转,还连接在一起,你怎么分?

相关推荐

    Java将图片数据读取到缓冲区中的例子.rar

    Java将图片数据读取到缓冲区中的例子,借助图像的缓冲区,可实现像素级的图像数据处理,是一种处理图片数据很实用的一种方法,可实现较为复杂的图像变换加工,本例只是演示如何创建图像缓冲区,并没有其它的任何图像...

    Java缓冲区图像示例

    缓冲区图像是指直接在计算机内存中内创建的图像,因此可以对其进行像素级的处理,完成及其复杂的图像变换加工。本例演示的程序较为简单,仅仅是创建了一个缓冲区图像,并没有做任何的加工处理就将其显示出来,但这是...

    PixelMap:高性能位图,着重于像素级编辑。 没有更多的锁定位

    像素图高性能位图,着重于像素级编辑。 没有更多的锁定位。为什么要使用PixelMap? 在像素级别上操作位图时,GetPixel和SetPixel方法简直是乏味。 除了丑陋的类似于Java的语法外,由于GDI中包含的额外复杂性层,这些...

    pixel:由Kotlin Coroutines支持的Android轻量级图像加载器

    由Kotlin Coroutines支持的Android轻量级图像加载库。 最佳:像素执行以下优化:内存和磁盘缓存,按图像视图大小(逐像素)对内存中的图像进行下采样,重新使用位图,自动暂停/取消请求(签名请求)等。 光线:...

    MATLAB数据字典生成代码-clij.github.io:面向所有人的GPU加速图像处理

    尽管其中大多数是经典图像处理操作,但CLIJ2还允许对可能表示的像素和像素之间执行操作。 它可以使用,但用户不必学习新的编程语言(例如OpenCL),他们可以透明地使用它。 入门级编码技能就足够了! 加大了对文档,...

    clij2:面向所有人的GPU加速图像处理

    尽管其中大多数是经典图像处理操作,但CLIJ2还允许在可能表示和像素之间的上执行操作。 它在后台使用但用户不必学习诸如OpenCL之类的新编程语言,他们可以透明地使用它。 入门级编码技能就足够了! 加大了对文档,...

    MATLAB数据字典生成代码-clij2-docs:CLIJ2的文档

    尽管其中大多数是经典图像处理操作,但CLIJ2还允许对可能表示的像素和像素之间执行操作。 它可以使用,但用户不必学习新的编程语言(例如OpenCL),他们可以透明地使用它。 入门级编码技能就足够了! 加大了对文档,...

    《Android应用开发揭秘》源码

     5.2.8 图像像素操作  5.2.9 Shader类介绍  5.2.10 双缓冲技术  5.2.11 全屏显示  5.2.12 获得屏幕属性  5.3 动画实现  5.3.1 Tween动画  5.3.2 Frame动画  5.3.3 GIF动画播放  5.4 小结  第6章 Android...

    新版Android开发教程.rar

    � Android 更像一款桌面环境为 Java 的 Linux 操作系统。有助于 Google 实现其 " 随时随地为每个人提供信 息 " 的企业战略。 HTC HTC HTC HTC Dream/G1 Dream/G1 Dream/G1 Dream/G1 具体配置 硬件 3.17 英寸 HVGA ...

    《Android应用开发揭秘》附带光盘代码.

     5.2.8 图像像素操作  5.2.9 Shader类介绍  5.2.10 双缓冲技术  5.2.11 全屏显示  5.2.12 获得屏幕属性  5.3 动画实现  5.3.1 Tween动画  5.3.2 Frame动画  5.3.3 GIF动画播放  5.4 小结  第6章 Android...

    android开发揭秘PDF

    5.2.8 图像像素操作 5.2.9 Shader类介绍 5.2.10 双缓冲技术 5.2.11 全屏显示 5.2.12 获得屏幕属性 5.3 动画实现 5.3.1 Tween动画 5.3.2 Frame动画 5.3.3 GIF动画播放 5.4 小结 第6章 Android数据存储 6.1 Android...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    认为应该针对那些最高级、最完善的浏览器来开发网站。而将那些被认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段 渐进增强 一开始只构建站点的最少特性,然后不断针对各浏览器追加功能。先让...

    Pixurch:android image search for Codepath Android dev course

    像素图 android image search for Codepath Android dev course 完成的用户故事: 用户可以输入一个搜索查询,该查询将显示来自 Google Image API 的图像结果网格。 用户可以点击“设置”,允许选择高级搜索选项来...

    Android应用开发揭秘pdf高清版

    5.2.8 图像像素操作 5.2.9 Shader类介绍 5.2.10 双缓冲技术 5.2.11 全屏显示 5.2.12 获得屏幕属性 5.3 动画实现 5.3.1 Tween动画 5.3.2 Frame动画 5.3.3 GIF动画播放 5.4 小结 第6章 Android数据存储 6.1 Android...

    OPhone应用开发权威指南(黄晓庆)

    9.3.4 从服务器端下载图片 390 9.4 设计C/S通信数据格式 392 9.4.1 对象序列化 396 9.4.2 使用XML传输对象 401 9.5 小结 409 第10章 高级通信技术 410 10.1 电话 410 10.1.1 电话呼叫 410 10.1.2 监听电话状态 412 ...

Global site tag (gtag.js) - Google Analytics