首先我得承认,关注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. js 数组清空 方法 汇总

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. 在命令行上 Ubuntu 下使用 mutt 和 msmtp 发送 Gmail 邮件

    在命令行写email from ubuntu 参考:      http://www.habadog.com/2011/11/23/send-mail-with-msmtp-mutt-linux    ...

  3. How to set up OpenERP for various timezone kindly follow the following steps to select timezone in OpenERP

        How to set up OpenERP for different Time Zones Click on the "Edit Preferences" wheel a ...

  4. uniq命令 (转)

    uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用.也就是说,为了使uniq起作用,所有的重复行必须是相邻的. uniq语法 [root@www ~]# uniq [-icu] ...

  5. Unity 添加自定义菜单(插件),添加功能

    网上介绍如何写这种插件的文章很多...但是对于新手来说,最基本的,怎么运行这个插件,都不知道...网上的文章都懒得说这个...   幸好,看了半天官方网站别的资料,突然就发现办法了...   这个不是 ...

  6. js-form表单元素的自定义属性

      form表单元素的自定义属性 CreateTime--2016年9月22日09:03:40 Author:Marydon 场景: <script type="text/javasc ...

  7. Java 性能测试的四项原则

    绝大数的开发人员在日常工作过程中都会或多或少的遇见过性能问题,本文旨在阐述性能测试的理论,从而为性能分析和开发人员做指导.本文对于那些刚刚接触性能调优和正在解决问题的开发人员也能提供一些启发性的思路. ...

  8. Mac环境 MySQL 和 MySQLWorkBench 破解版百度云下载

    最近有小伙伴下载,我正好保存有 正好分享一下 下载路径: Max环境下下载安装 1.下载完直接安装 MySQL安装后,这里可以查看 2.MySQLWorkBench安装完,桌面会有图标 打开后,用lo ...

  9. O(n)复杂度求没有出现的数字(leetcode448)

    一个长度为N的数组,其中元素取值为1-N,求这个数组中没有出现的.1-N之间的数字. 要求无额外空间,O(n)时间复杂度. nums[i]=-1表示i数字已经出现过了 class Solution(o ...

  10. Extending_and_embedding_php翻译

    http://blog.csdn.net/lgg201 博客翻译了Extending_and_embedding_php