- 浏览: 289819 次
- 性别:
- 来自: 龙城
最新评论
-
redey:
这垃圾东西,1.6以上JDK不支持
Jocky混淆JAVA代码(保护你的JAVA项目) -
u012907473:
水电费是否是否
js页面缓存的一个解决办法 -
jackson200:
讲解的很详细!
Jocky混淆JAVA代码(保护你的JAVA项目) -
jamesqq79:
下载解压缩后,不知是何文件格式,用PDF阅读器打不开。
Java程序员的推荐阅读书籍之十《Agile Java》 -
meimei727:
<!-- 给页面文件中的js和css引用增加版本号 -- ...
利用ant进行项目发布
由于近期工作的一些需要,研究了下验证码的自动识别方面的东西,同时参考了网上别人写的一些程序和思路,这里大概记一下,主要用于备忘。该方法只适用于字体统一规整的、没有扭曲拉伸的简单数字验证码的识别,形如 这样的图片验证码,可以考虑采用类似的法来进行自动识别。
算法思路如下:
1. 根据验证码图片的分析结果(主要是分析数字所在的像素位置),对其进行分割,分割成包含单个数字的图片。
2. 对分割后的图片先进行灰度化,然后二值化,生成单色位图。
3. 读取单色位图的像素点,转换为 0 , 1 数组。
4.把该数组和提前生成好的0-9的字模数组进行比对,取匹配率最大的那个字模所对应的数字。
package cn.xxx.util.image; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import javax.imageio.ImageIO; import javax.media.jai.JAI; import javax.media.jai.RenderedOp; /** * 数字验证码识别器(用于识别xxx系统的图片验证码) * * 算法如下: 分析验证码图片结构,将其分隔成4个独立的数字图片,把四个独立的数字图片处理成单色位图。 * 把单色位图转换为0、1数组,然后分别和0-9的字模进行匹配,得到图片上的数字信息。 * * @version 1.0 2009-7-7 * @author huangyuanmu * @since JDK 1.5.0_8 */ public class NumberVerificationCodeIdentifier { static { System.setProperty("com.sun.media.jai.disableMediaLib", "true"); } // 数字模板 0-9 static int[][] value = { // num 0; { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0 }, // num 1 { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, // num2 { 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0 }, // num3 { 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0 }, // num4 { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, // num5 { 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // num6 { 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0 }, // num7 { 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // num8 { 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0 }, // num9 { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0 } }; /** * 识别图像 * * @author huangyuanmu 2009-7-14 * @param byteArray * @return * @throws Exception */ public static String recognize(byte[] byteArray) throws Exception { InputStream is = new ByteArrayInputStream(byteArray); BufferedImage image = ImageIO.read(is); return recognize(image); } /** * 识别图像 * * @author huangyuanmu 2009-7-14 * @param image * @return * @throws Exception */ public static String recognize(BufferedImage image) throws Exception { StringBuffer sb = new StringBuffer(""); BufferedImage newim[] = new BufferedImage[4]; if(null == image){ throw new RuntimeException("iamage为null"); } // 将图像分成四块,因为要处理的文件有四个数字。 newim[0] = generateSingleColorBitMap(image.getSubimage(2, 1, 8, 11)); newim[1] = generateSingleColorBitMap(image.getSubimage(11, 1, 8, 11)); newim[2] = generateSingleColorBitMap(image.getSubimage(20, 1, 8, 11)); newim[3] = generateSingleColorBitMap(image.getSubimage(29, 1, 8, 11)); for (int k = 0; k < 4; k++) { int iw = newim[k].getWidth(null); int ih = newim[k].getHeight(null); int[] 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; } } // 得到像匹配的数字。 int r = getMatchNum(pix); sb.append(r); } return sb.toString(); } /** * 把单色位图转换成的0、1数组和字模数组进行比较,返回匹配的数字 * * @author huangyuanmu 2009-7-7 * @param pix * @return */ private static 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]); } if(x == 0){ result = k; break; }else if (x < temp){ temp = x; result = k; } } return result; } /** * 把彩色图像转换单色图像 * * @author huangyuanmu 2009-7-7 * @param colorImage * @return */ private static BufferedImage generateSingleColorBitMap(Image colorImage) { BufferedImage image = new BufferedImage(8, 11, BufferedImage.TYPE_BYTE_GRAY); Graphics g = image.getGraphics(); g.drawImage(colorImage, 0, 0, null); g.dispose(); RenderedOp ro = JAI.create("binarize", image, new Double(100)); BufferedImage bi = ro.getAsBufferedImage(); return bi; } /** * 测试 * * @author huangyuanmu 2009-7-7 * @param args */ public static void main(String args[]) throws Exception { String s = recognize(ImageIO.read(new File("D:\\1.jpg"))); System.out.println("recognize result" + s); } }
复杂的验证码识别技术就相当复杂了,个人也没有精力去研究了,使用现成的OCR软件不失为一个便捷的方法。tesseract是一个不错的选择,它是惠普公司开发的一个OCR软件,后来提交给google进行了开源。经过个人试用,能力还是比较强大的,抗干扰能力挺不错的。
- NumberVerificationCodeIdentifier.rar (1.9 KB)
- 下载次数: 566
发表评论
-
autochk program not found 蓝屏重启问题解决
2012-04-17 10:54 13841起因: 因为硬盘空间不够,所以把原来的双系统中的ubu ... -
IOS开发一些资源
2012-02-06 16:07 1365从别的地方看到的,多谢作者,现贴在这里备忘。 在线教程 ... -
发现一个好东东,可以让浏览器跟本地桌面交互,哈哈
2011-09-08 17:35 1248http://gears.google.com/ -
nodejs开发运行环境搭建
2011-08-18 15:03 4403一. geddy 开发运行环境搭建 geddy是基 ... -
javascript来势凶猛
2011-08-15 17:22 1215引子 java编程弄了7,8个年头了,也 ... -
Oracle驱动包装
2011-07-06 17:06 2036见附件。 -
javaeye域名变了
2011-04-01 10:31 1280javaeye域名变了,才发现,哈哈,mark下。 -
拥抱敏捷
2011-01-15 17:27 1100前言 有关项目管理和软件开发方 ... -
重温设计模式
2011-01-13 10:27 1165策略模式: 定义了算 ... -
jsoup,html解析的利器
2011-01-07 09:21 1208http://jsoup.org/download -
关于html表格复制到excel
2010-09-09 14:04 5875刚才一个朋友问我这个事情,我拍脑袋想了一下,给他答复不可能,因 ... -
Java 路径 System.getProperty("key")的参数key
2010-09-02 14:37 1289java.version ... -
这种需求,大家看看有没有比较好的解决方案
2010-06-25 09:47 2343在我们的应用中,碰到了如图所示的一种网络结构。 重新描 ... -
java中singleton的几种实现方式
2010-06-24 15:08 1476传统的最简单的方式 这种模式有一个缺点就是不能实现延 ... -
oracle分页查询数据重复问题的解决
2010-06-24 11:00 3429在oracle分页查询中,我们采用类似以下所示的公认的比较高效 ... -
ubuntu10.04中安装使用IE6
2010-06-21 09:55 2598在用ubuntu910的时候,已经装了一遍IE了,但是升级到1 ... -
今天发现的两个有价值的东东
2010-06-17 15:45 1520其一,iRedMail,开源邮件解决方案。 其 ... -
ubuntu 10.04 中安装mysql5.1.4
2010-06-17 15:28 1837自从升级到10.04以后,mysql就不正常,卸载装了n次,均 ... -
升级到ubuntu 10.04,wine中的ie不正常了
2010-06-11 10:01 1708ubuntu上也折腾了半年了,日常工作生活基本没有太多的障碍了 ... -
升级到ubuntu10.04,mysql不能用了
2010-06-11 09:53 18789.10版本用了半年了,10.04发布了,看了10.04的宣传 ...
相关推荐
在"易语言数字验证码识别"这个主题中,我们主要探讨的是如何使用易语言来开发一个能够识别数字验证码的程序。验证码是一种常见的网络安全措施,用于防止自动化程序(如机器人)对网站进行恶意操作。它通常包含一组...
### 数字验证码识别算法的研究和设计 #### 一、引言 随着互联网技术的发展,验证码作为一种防止自动化程序滥用网络服务的有效手段,在各种网络应用中得到了广泛的应用。其中,基于文本的验证码通过生成包含随机...
而“按键精灵”是一款自动化工具,它允许用户通过录制和脚本编程的方式来模拟键盘和鼠标操作,实现一系列自动化的任务执行。...通过深入学习和实践,不仅可以应对验证码识别,还能扩展到更广泛的自动化应用领域。
【OpenCV实现图形图片验证码识别】 验证码(CAPTCHA)是一种防止机器自动操作的安全机制,它通常包含扭曲的字母或数字组合,旨在仅让人类能够识别。然而,随着计算机视觉技术的发展,尤其是OpenCV库的广泛应用,...
含源代码,VS2008编译通过 验证码的识别步骤: 1. 对图像进行去噪点处理 2. 得到每个验证码独立图片(分割步骤1后的图) 3. 收集每个验证码的特征码 4. 找出当前验证码在特征码集中相似度最高的,确定验证码
4. **批量处理**:支持批量处理大量验证码图片,提高工作效率,适用于大规模的验证码识别需求。 5. **用户友好**:提供直观的界面和简单易用的操作流程,让非技术人员也能轻松使用。 6. **安全性**:虽然验证码...
Python图片验证码字母或数字通用识别代码,简单方便调用。Python图片验证码字母或数字通用识别代码,简单方便调用。Python图片验证码字母或数字通用识别代码,简单方便调用。Python图片验证码字母或数字通用识别代码...
在VB中实现数字验证码识别,主要涉及以下几个步骤: 1. 图像加载:使用VB的Image类或相关的图形库,将验证码图片加载到内存中,以便进一步处理。这通常涉及到文件I/O操作,例如使用`Image.FromFile()`方法。 2. ...
在这个场景中,我们有一个简单的验证码识别代码,可能是用VC++编写的,这是一个非常基础且广泛使用的编程语言,尤其在Windows平台下开发桌面应用程序。 验证码识别通常包括以下几个关键步骤: 1. **图像预处理**:...
《基于LibSVM的验证码识别》 验证码识别技术在网络安全领域扮演着至关重要的角色,它主要用于防止自动化的机器人程序进行恶意操作。本项目基于流行的机器学习库LibSVM(Support Vector Machine,支持向量机)实现...
1. 图像处理:验证码识别的第一步通常是将验证码图片转化为数字或逻辑可处理的形式。这包括灰度化、二值化等预处理步骤,以减少图像噪声并突出文字特征。 2. 特征提取:从预处理后的图像中提取出文字特征,如边缘、...
验证码识别技术是网络安全领域中的一个重要组成部分,主要用于防止自动化程序(如机器人)进行恶意操作,如批量注册、垃圾信息发布等。本主题将详细探讨验证码识别,特别是如何使用C#、VB.NET和PHP等编程语言实现...
C#简单数字验证码图片识别工具系统的设计与实现毕业论文 该论文的主要内容是设计和实现一个简单数字验证码图片识别工具系统,以防止大量恶意程序的登录和自动化攻击。该系统基于.NET开发平台,使用C#语言进行开发,...
验证码识别技术是信息安全领域中的一个重要话题,特别是在防止自动化程序(如机器人)滥用服务时。VB,全称Visual Basic,是一种由Microsoft开发的编程环境,它提供了丰富的功能来创建图形用户界面和处理各种任务,...
如果验证码仅限字母和数字,可以构建一个简单的字符分类器,如基于神经网络的模型,对常见的26个英文字母和10个数字进行训练。 5. 结果验证:识别出的字符会组成一个字符串,与用户输入的验证码进行比对,若一致则...
【简单图片数字识别】是一种计算机视觉技术,它主要用于自动识别图像中的数字,广泛应用于验证码识别、自动车牌识别、银行支票读取等领域。这项技术基于深度学习和机器学习算法,尤其是卷积神经网络(Convolutional ...
在这个“易语言图片分割验证码识别”项目中,我们关注的核心技术是如何使用易语言来处理图像识别,特别是针对验证码的识别。 验证码(CAPTCHA)是一种用于防止自动化程序滥用服务的技术,它通常会展示一个扭曲的...
在验证码识别任务中,CNN可以从复杂的图像模式中识别出字母、数字或者符号。 验证码识别的流程通常包括以下步骤: 1. **数据预处理**:首先,我们需要收集大量的验证码图片作为训练数据。这些图片可能包含不同角度...
验证码识别技术是网络安全领域中的一个重要组成部分,主要用于防止自动化的机器人程序或者恶意用户进行非法操作,如批量注册、恶意登录等。在.NET开发环境中,有很多现成的类库可以帮助开发者实现自定义的验证码生成...