用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图像识别技术实例教程知识点解析 #### 一、Java图像识别基础概念 在Java中进行图像识别是一项涉及计算机视觉领域的技术应用。本教程主要介绍了如何利用Java的标准库中的`BufferedImage`和`ImageIO`类来...
本文将详细介绍一个具体的Java图像识别技术实例,该实例使用Java实现了一个简单的图像识别算法,主要针对特定数字组合进行识别。 #### 二、项目背景及目标 本项目的目的是开发一个基于Java的图像识别系统,能够...
本文将详细介绍Java实现图像识别技术的实例,包括图像处理、像素操作以及图像识别算法的实现,并提供完整的Java源代码实例。 首先,我们探讨Java实现图像识别技术的必要性。Java语言具有良好的跨平台特性,其虚拟机...
本资源包“Java图像编程实例库”提供了一系列的示例代码,旨在帮助开发者理解和应用Java中的图像处理技术。以下将详细介绍其中可能涵盖的知识点。 1. **Java AWT 和 Swing**: 这两个是Java GUI的主要框架,提供了...
### 一、图像识别与处理课程背景 **云南大学软件学院**开设的图像识别与处理课程,是面向计算机科学及相关专业学生的一门专业课。该课程主要介绍了图像处理的基本原理和技术,包括图像的获取、存储、显示以及基本的...
Java图像文字识别技术主要涉及到计算机视觉和自然语言处理领域,是一种将图像中的文字转换为可编辑文本的技术。在Java中实现这一功能,通常需要借助外部的OCR(Optical Character Recognition,光学字符识别)引擎,...
对于初学者,这是一个很好的实践项目,能够提升对Java编程、API调用以及图像识别技术的理解。 总结来说,这个项目结合了Java编程、百度API的图像识别服务和GUI设计,为学习者提供了一个实际的、完整的应用场景,有...
在该技术实例代码中,主要使用了 Java 语言调用系统任务来实现图像识别。首先,需要将图像文件传入到系统中,然后使用 tesseract 图像识别引擎来识别图像中的文字。识别后的文字将被输出为文本形式。 在该技术实例...
这个Java验证码识别的例子对于学习者来说,不仅可以理解验证码识别的基本流程,还能深入学习Java图像处理和OCR技术的实践应用。同时,它也可以作为一个基础,用于开发更复杂的自动化工具,比如自动登录、数据抓取等...
Java图像处理技术广泛应用于计算机视觉、人工智能、机器学习、图像识别、图像压缩等领域。 1. Java图像处理的基本概念 Java图像处理的基本概念包括图像的表示、图像的存储、图像的读取和保存等。图像可以用二维...
Java图像识别技术是一种在计算机视觉领域中广泛应用的技术,主要用于处理和分析数字图像,以自动识别图像中的特定元素或模式。在这个“java_image.rar”压缩包中,包含了一个名为“java_image.doc”的文档,该文档很...
总结来说,"腾讯身份证验证人脸识别代码java实例"涵盖了使用腾讯AI的身份证识别和人脸识别接口,通过Java编程语言实现与腾讯AI服务器的交互,进行活体检测和身份验证。`FaceRecognitionService.java` 文件是这一过程...
在Java编程环境中,数字图像处理是一项重要的技术,广泛应用于图像分析、识别、增强等领域。"JAVA基本数字图像处理"这个项目旨在通过Java语言实现一系列基本的图像操作,以帮助开发者理解图像处理的基本原理并掌握其...
总的来说,"EAN13码图像识别实例C#"项目涉及到了C#编程、图像处理、条码识别和计算机视觉技术的综合运用。通过理解和实践这个项目,开发者不仅可以掌握EAN13码的识别流程,还能提升在.NET环境下解决复杂图像处理问题...
OpenCV则是一个跨平台的计算机视觉库,它的功能更加强大,除了裁剪,还可以进行图像识别、人脸识别等操作。在OpenCV中,裁剪图像可以使用`Rect`对象定义裁剪区域,然后配合`Mat`对象的`crop`方法实现。 需要注意的...
以上知识覆盖了Java图像处理的核心部分,但实际应用中还可能涉及到更高级的图像分析技术,如特征提取、物体识别和图像分类等。对于深入学习这些技术,需要掌握更多的数学背景,如线性代数、概率统计和机器学习原理。...
总的来说,"JAVA图像处理源码"可能包含了使用Java 2D API和OpenCV等工具进行图像识别与处理的实例代码。理解并掌握这些技术对于开发者来说是提升项目能力的重要步骤,特别是在需要处理大量图像数据的现代应用中。...
以下是根据所提供的文件内容,总结的关于Java图像处理的相关知识点: 1. BMP图像文件格式基础: BMP格式是一种常用的图像文件格式,它记录图像的数据是按照位图(bitmap)进行存储的。BMP文件由两个主要部分组成:...
在IT行业中,联众识别是一种常见的验证码识别技术,主要用于自动化处理网页或应用中的图像验证码。在本案例中,我们关注的是使用JAVA编程语言通过HTTP协议实现联众打码的实例。这个压缩包文件"联众识别-JAVA-HTTP-...
验证码识别是信息安全领域中的一个重要话题,它涉及到计算机视觉、图像处理和模式识别技术。Java作为广泛应用的编程语言,也提供了多种方法来实现验证码识别。在这个“java-验证码识别-验证码破解”的主题中,我们将...