首先我得承认,关注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
 

使用tesseract-ocr破解网站验证码的更多相关文章

  1. Keras入门(四)之利用CNN模型轻松破解网站验证码

    项目简介   在之前的文章keras入门(三)搭建CNN模型破解网站验证码中,笔者介绍介绍了如何用Keras来搭建CNN模型来破解网站的验证码,其中验证码含有字母和数字.   让我们一起回顾一下那篇文 ...

  2. keras入门(三)搭建CNN模型破解网站验证码

    项目介绍   在文章CNN大战验证码中,我们利用TensorFlow搭建了简单的CNN模型来破解某个网站的验证码.验证码如下: 在本文中,我们将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的 ...

  3. tesseract ocr训练 pt验证码

    识别率有问题A大概率识别为n,因此需要训练,这里讲一下 如何训练 参考 java代码里边直接使用tess4j,是对tesseract的封装,但是如果要训练,还是需要在进行安装tesseract-ocr ...

  4. 【转】TensorFlow练习20: 使用深度学习破解字符验证码

    验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册.灌水.发垃圾广告等等 . 验证码的作用是验证用户是真人还是机器人:设计理念是对人友好,对机 ...

  5. 文字识别还能这样用?通过Python做文字识别到破解图片验证码

    前期准备 1. 安装包,直接在终端上输入pip指令即可: # 发送浏览器请求 pip3 install requests # 文字识别 pip3 install pytesseract # 图片处理 ...

  6. 用imagemagick和tesseract-ocr破解简单验证码

    用imagemagick和tesseract-ocr破解简单验证码 Tesseract-ocr据说辨识程度是世界排名第三,可谓神器啊. 准备工作: 1.安装tesseract-ocr sudo apt ...

  7. Python脚本破解图形验证码(tesserocr和pytesseract)

    在学习之前,我们先了解OCR.tesseract.tesserocr.pytesseract和opencv这几个跟图片处理有关的库. OCR(Optical Character Recognition ...

  8. Tesseract Ocr引擎

    Tesseract Ocr引擎 1.Tesseract介绍 tesseract 是一个google支持的开源ocr项目,其项目地址:https://github.com/tesseract-ocr/t ...

  9. [转帖]web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。

    web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全. https://www.cnblogs.com/1996V/p/7458377.html 感谢原作者写的内容 安全 ...

随机推荐

  1. SSH框架学习

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  2. MVC日期和其它字符串格式化

    -- (月份位置不是03) string.Format("{0:D}",System.DateTime.Now) 结果为:2009年3月20日 : :: -- : -- :: st ...

  3. PHP-深入学习Smarty

    本文中的边界标签分别为"<{"和"}>" start-12, 都是静态模板中的内容, 即使函数也只是模板中的标签或者变量调解器; 13-end, 都 ...

  4. tkinter Canvas画图片大坑总结

    一.ImportError: cannot import name '_imagingtk' 问题描述 使用tkinter画pillow生成的图片时,在tkinter中抛出此异常. 解决方案 pip ...

  5. 如何在cmd命令行中查看、修改、删除与添加环境变量,语法格式例子:set path;echo %APPDATA%

    如何在cmd命令行中查看.修改.删除与添加环境变量 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用.永久性修 ...

  6. C# Timer使用方法示例

    实例化一个timer: // 每5分钟执行一次,每次执行的间隔毫秒时长 System.Timers.Timer timer = new System.Timers.Timer(5*60*1000); ...

  7. 【转载】微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    微服务框架选型,原文链接请参见:http://blog.didispace.com/microservice-framework/ http://blog.csdn.net/zeb_perfect/a ...

  8. 1.Java基础-面向对象编程思想(封装继承多态接口)

    封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的 ...

  9. vue学习01

    vue学习01   1. 创建一个Vue实例官网-学习-教程-安装-(开发/生产版本)-与jQuery的引用相似 <!DOCTYPE html> <html> <head ...

  10. Error_GL_总账日记账过账失败