
以Java语言实现Java图像识别技术的示例. 首先,利用Matlab实现了识别算法的仿真. 因为它仅识别数字的特定组合,所以非常简单. 它放弃了更复杂的识别算法,并使用了最常见的像素比较识别算法. (如果背景噪音更复杂,可以考虑先过滤然后再确定. )在编写Java程序时,我发现了一些问题. Internet上关于像素级操作的信息太多,有些则不太正确. 我特此写下自己的结果,并与大家分享. 核心类: BufferedImage,ImageIO ImageIO类提供图像读写接口,可以对URL,InputStream等进行操作,以获取图像信息非常方便. ImageIO属于javax.imageio. *软件包中jdk中的标准类. 提供的方法是: read()示例: BufferedImage imd = ImageIO.read(new File(file)); write()示例: ImageIO.write(imd,“ JPEG”,新File(“ C: \\ test” + k +“. gif”)); //特定的方法可以找到jdk doc BufferedImage类是Image类的子类,与Image不同,它是在内存中创建和修改的,是否可以显示它取决于您的特定需求.

由于我将其用于图像识别,因此无需显示它. 您可以通过ImageIO方法将文件读取到BufferedImage或将其写回到文件中. 在前两种方法中可以看到类似的操作. 并参考jdk文档,因为我想识别类似于身份验证的数字字符串图像,因此我认为将这些数字分开,存在于不同的图像中,这里的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);现在我们有了像素,我们可以看到像素是一维数组,如果您不习惯它,可以考虑将它们存储在二维数组中,然后来实现您的看家算法,即小波变换,拉普拉斯算子,尽管加油. 方便吗您似乎对此不太了解,因此我将为您提供一些源代码,包括像素分解和识别算法. 源代码/ * *创建于2005-11-29 ** TODO要更改此生成文件的模板,请转至* Window-Preferences-Java-Code样式代码模板* / package com.syvin.image;导入java.awt. *;导入java.awt.image. *;导入java.io.FileOutputStream;导入java.io. *;导入java.io.InputStream;导入java.net.URL;导入javax.imageio. *;公共类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: \\ Untitled.bmp“); //获取识别字符串System.out.println(“ recognize result” + s); byte [] by = s.getBytes();文件f = new File(“ C: \\ testfile.txt”); FileOutputStream fos = new FileOutputStream(f); //写一个结果文件fos.write(by); fos.close(); } catch(Exception e){e.printStackTrace();}} //构造函数public MyImage()抛出IOException {super(“ Image Test”); try {} catch(Exception e){e.printStackTrace();}} //获取图像的值公开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]java 图像识别算法,“ JPEG ”,新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; ifor(int j = 0 ; j pix [i *(iw)+ j] = newim [k] .getRGB(j,i); if(pix [i *(iw)+ j] ==-1)pix [i *(iw)+ j] = 0;否则pix [i *(iw)+ j] = 1; x [k] = x [k] + pix [i *(iw)+ j];}} //获取数字,例如match.

int r = this.getMatchNum(pix); sb.append(r); System.out.println(“ x =” + x [k]); }} catch(Exception e){e.printStackTrace();} return sb.toString();} //数字模板0-9静态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,1,0,0java 图像识别算法,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},//编号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,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,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,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; ix = 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;}}返回结果;}}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-270347-1.html
金华王子们又受打击