首先我得承认,关注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. JDBC的简单操作

    JDBC是一组能够执行SQL语句的API 由于传统的数据库操作方式需要程序员掌握各个不同的数据库的API,极其不便 因此java定义了JDBC这一标准的接口和类,为程序员操作数据库提供了统一的方式 J ...

  2. IO习题

    1.Java实现将九九乘法表输入到文本文件 public class Test1 { public static void main(String[] args) throws FileNotFoun ...

  3. windows命令行设置IP与DNS

    用dos命令修改IP等本地连接属性 平时我们改IP通常都在是窗口界面本地连接直接修改, 那在命令行也可以设置IP地址?当然可以,这里要用到netsh命令 .点击“开始”->“运行”,输入“cmd ...

  4. 使用JDK自带的JAXB进行类和xml的互转

    Classroom.java public class Classroom { private int id; private String name; private int grade; publ ...

  5. HTTP协议详解之基本认证篇

    •什么是HTTP基本认证: 桌面应用程序也通过HTTP协议跟web服务器交互,桌面应用程序一般不会使用cookie,而是把‘用户名+:+密码’用base64编码之后的string放在request中的 ...

  6. java中list、set和map 的区别(转)

    作者:佚名出处:IT专家网论坛 2009-06-17 13:00   List按对象进入的顺序保存对象,不做排序或编辑操作.Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素 ...

  7. 如何在MyEclipse中将项目部署Tomcat

    如果系统里面还没有配置Tomcat,请参照<Windows下如何配置tomcat环境变量>. 1.新建一个web project项目.如下: 效果如下: 2.编写一个实现Servlet接口 ...

  8. Linux下MySQL链接被防火墙阻止

    Linux下安装了MySQL,不能从其它机器访问 帐号已经授权从任意主机进行访问 vi /etc/sysconfig/iptables 在后面添加 -A RH-Firewall-1-INPUT -m ...

  9. Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)

    我是做Tracking 的,对于速度要求非常高.发现傅里叶变换能够使用. 于是学习之. 核心: 最根本的一点就是将时域内的信号转移到频域里面.这样时域里的卷积能够转换为频域内的乘积! 在分析图像信号的 ...

  10. (原)Ubuntu16中安装nvidia的显卡驱动

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5638185.html part1 直接在“软件和更新-附加驱动”里面设置 安装完ubuntu16后,显 ...