`
冽豹之姿
  • 浏览: 40401 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java像素级图像处理与识别方法

    博客分类:
  • 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);
现在我们得到了像素,可以看出像素是一个一维数组,你如果不习惯可以考虑保存在一个二维的数组中,然后就来实施你的看家算法,什么小波变换,拉普拉斯算子,尽管来吧。怎么样是不是很方便呢?什么你好像看不太懂,好给你一些源程序好了,包括像素分解和识别算法。

源代码
/*
* Created on 2005-11-29
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.syvin.image;

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
for(int j=0;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
,
//num3
,
//num4
,
//num5
,
//num6
,
//num7
,
//num8
,
//num9
};

//图像像素相减取绝对值得到最小熵的结果。
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
     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=x;
     result=k;
    }
   
   }

   return result;
}

}
分享到:
评论

相关推荐

    java-pixel-level-image.zip_java pixel

    java像素级图像处理与识别方法,对于游戏开发很有帮助

    java实现图像处理算法

    示例代码展示了如何使用Java的图像处理库来对图像进行灰度化处理。在代码中,我们使用javax.imageio.ImageIO类加载输入图像文件,并创建一个与输入图像具有相同尺寸和类型的输出图像。然后,我们遍历输入图像的每个...

    基于opencv3.1库的JAVA源码

    2-6 整合Java之Eclipse与OpenCV 49 2-7 开发第一个OpenCV程式 51 2-8 建立矩阵 52 范例2-8-1 建立第一个opencv的矩阵,使用阵列 53 范例2-8-2 建立opencv的Mat矩阵方法2 55 范例2-8-3 方法3以单一元素指定 56 范例2-8...

    opencv可通过rtmp/rtsp获取视频流人脸识别与并截图

    opencv可通过rtmp/rtsp获取视频流人脸识别与并截图,JAVA版本

    java图形图象处课程设计(论文+系统详细源代码).zip

    数字图像的增强是图像处理中的一个重要研究内容之一,是图像处理的一项基本技术。图像增强是指按特定的需要突出一幅图像的某些信息,同时,削弱或除去某些不需要的信息的处理方法。 图像增强在人眼对图像的识别中很...

    easyAi傻瓜式Java AI框架.rar

    java傻瓜ai框架,无需任何算法知识,通过简单的api调用就可以实现 常用的图像内物体的识别,定位等图像ai服务,及自然语言分类处理服务。面向java开发程序员,不依赖任何第三方库,第三方接口,独立包。 目前拥有的...

    9. OpenCV进行图像相似度对比的几种办法 - zchang81的博客 - CSDN博客1

    简介:https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratioPSNR是最普遍和使用最为广泛的一种图像客

    基于opencv制作的工业图像检测处理工具-项目名称:基于机器视觉柔性加工辅助系统+源代码+文档说明

    目标检测模型、智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、智能控制、路径规划、无人机等多种领域的算法仿真实验,更多源码,请上博主主页搜索。 ---------------------------------------------...

    基于C++的炉石传说机器人.zip

    流程:灰度化,阈值成二值图像,轮廓提取,测试得到卡牌的轮廓范围,近似矩形,得到卡牌数(得到先手还是后手),根据轮廓得到每个卡牌,对每个卡牌的左上角进行灰度处理,阈值化,轮廓提取,得到数字图像。...

    envi 教程(适用于初学者)

    ENVI由遥感领域的科学家采用IDL开发的一套功能强大的遥感图像处理软件;它是快速、便捷、准确地从地理空间影像中提取信息的首屈一指的软件解决方案,它提供先进的,人性化的使用工具来方便用户读取、准备、 探测、...

    Symbian系统

    识别Series90的最简便方法是:会采用触摸屏幕,分辨率也高达640*320像素。Series90应该是手机游戏、娱乐的最强平台,但因为采用Series90界面的手机型号太少,第三方软件的支持很少,所以S60依旧是玩家首选。 S40或...

    安卓手机java源码阅读器-ultimateMICR-SDK:使用深度学习从MagneticInkCharacterRecognition[M

    安卓手机java源码阅读器 完整文档位于 在线演示在 开源计算机视觉库: 这是使用深度学习的最先进的检测器和识别器。 与您可以在网络上找到的其他解决方案不同,您不需要调整相机/图像来定义感兴趣区域 (ROI)。 我们...

    《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应用开发揭秘》附带光盘代码.

     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开发揭秘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...

Global site tag (gtag.js) - Google Analytics