首先我得承认,关注tesseract-ocr, 是冲着下面这篇文章的噱头去的,26行groovy代码破解网站验证码 
http://www.kellyrob99.com/blog/2010/03/14/breaking-weak-captcha-in-slightly-more-than-26-lines-of-groovy-code/

当然,看了之后才知道,原来是调用了三方库tesseract-ocr…… 
http://code.google.com/p/tesseract-ocr/

尽管如此,本着邓爷爷的“不管白猫黑猫,能抓住老鼠的就是好猫”的原则,趁着假期也开始了“文字识别”的初级研究

HP的tesseract最近被Google支持并开支持英文字母和数字,据说辨识程度是世界排名第三的;更难能可贵的是,提供多国语言包下载(包括中文,精度不咋的倒是真的……),并自带训练工具。

安装完并跑过自带例子之后,首先想到的应用自然是用于验证码分析

按照说明,送入tesseract的图片的质量直接影响识别的效果,因此,简单的预处理是不可或缺的

1.首先灰度化,灰度值=0.3R+0.59G+0.11B:

  1. for (int y = minY; y < height; y++) {
  2. for (int x = minX; x < width; x++) {
  3. int rgb = srcImg.getRGB(x, y);
  4. Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。
  5. int gray = (int) (0.3 * color.getRed() + 0.59
  6. * color.getGreen() + 0.11 * color.getBlue());
  7. Color newColor = new Color(gray, gray, gray);
  8. srcImg.setRGB(x, y, newColor.getRGB());
  9. }
  10. }

结果如图: 

2.其次是灰度反转:

  1. for (int y = minY; y < height; y++) {
  2. for (int x = minX; x < width; x++) {
  3. int rgb = buffImg.getRGB(x, y);
  4. Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。
  5. Color newColor = new Color(255 - color.getRed(), 255 - color
  6. .getGreen(), 255 - color.getBlue());
  7. buffImg.setRGB(x, y, newColor.getRGB());
  8. }
  9. }

结果如图: 

3.再次是二值化,取图片的平均灰度作为阈值,低于该值的全都为0,高于该值的全都为255:

  1. for (int y = minY; y < height; y++) {
  2. for (int x = minX; x < width; x++) {
  3. int rgb = buffImg.getRGB(x, y);
  4. Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。
  5. int value = 255 - color.getBlue();
  6. if (value > average) {
  7. Color newColor = new Color(0, 0, 0);
  8. buffImg.setRGB(x, y, newColor.getRGB());
  9. } else {
  10. Color newColor = new Color(255, 255, 255);
  11. buffImg.setRGB(x, y, newColor.getRGB());
  12. }
  13. }
  14. }

结果如图: 

看看效果还凑合,就省却尺寸调整、中值滤波以及噪点去除等步骤了。

以上完成图片预处理工作;Tesseract没有开放api,纯命令行调用:

  1. List<String> cmd = new ArrayList<String>(); // 存放命令行参数的数组
  2. cmd.add(tessPath + "\\tesseract");
  3. cmd.add("");
  4. cmd.add(outputFile.getName()); // 输出文件位置
  5. cmd.add(LANG_OPTION); // 字符类别
  6. cmd.add("eng"); // 英文,找到tessdata里对应的字典文件。
  7. ProcessBuilder pb = new ProcessBuilder();
  8. pb.directory(imageFile.getParentFile());
  9. cmd.set(1, tempImage.getName()); // 把图片文件位置放在第一个位置
  10. pb.command(cmd); // 执行命令行
  11. pb.redirectErrorStream(true); // 通知进程生成器是否合并标准错误和标准输出,把进程错误保存起来。
  12. Process process = pb.start(); // 开始执行进程
  13. int w = process.waitFor(); // 当前进程停止,直到process停止执行,返回执行结果.

结果输出表示一切正常

当然,真正要用好tesseract-ocr,还需用到其强大地训练工具,就是后话了……

另外,关于文字识别,除去作为破解验证码的反制手段之外,我们是否也有相关的应用呢?

  • 大小: 1.1 KB
  • 大小: 1.3 KB
  • 大小: 1.3 KB
  • 大小: 1.4 KB
 

最新文章

  1. User space 与 Kernel space
  2. 在VS2010 下编译 cocos2d-x-2.1.4
  3. http://www.blogjava.net/zhangchao/archive/2011/05/26/351051.html
  4. csharp: Sound recording
  5. Hibernate3.3用户手册摘要-1-辅助类,session
  6. centos 安装http协议的git server
  7. 判断浏览器js代码
  8. tabbar加小红点
  9. 对比git pull和git pull --rebase
  10. hdu698 Just a Hook 线段树-成段更新
  11. CentOS 7 for ARM 安装一键Lnmp失败
  12. ES6 Generators基本概念
  13. jQuery中的选择器及筛选器
  14. 使用systemback制作Ubuntu自定义系统镜像和系统备份(抄)
  15. SQL反模式学习笔记20 明文密码
  16. 历届试题 小数第n位 (求循环节)
  17. 1-tomcat简介
  18. eclipse设置
  19. 【pygame游戏编程】第二篇-----移动图像
  20. maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题

热门文章

  1. Simple example
  2. iOS调试证书/公布证书制作
  3. 关于zookeeper的自我解惑
  4. 解决 Maven was cached in the local repository, resolution will not be reattempted until the update interv
  5. 安装itunes时提示不能删除旧版本的apple应用程序支持
  6. TCP Socket 粘包
  7. git版本库管理介绍,撤销git pull操作
  8. PHP5.5新特性
  9. [Python]网络爬虫(五):urllib2的使用细节与抓站技巧(转)
  10. JS取date的前一天时间