使用tesseract-ocr破解网站验证码
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:
- for (int y = minY; y < height; y++) {
- for (int x = minX; x < width; x++) {
- int rgb = srcImg.getRGB(x, y);
- Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。
- int gray = (int) (0.3 * color.getRed() + 0.59
- * color.getGreen() + 0.11 * color.getBlue());
- Color newColor = new Color(gray, gray, gray);
- srcImg.setRGB(x, y, newColor.getRGB());
- }
- }
结果如图: 
2.其次是灰度反转:
- for (int y = minY; y < height; y++) {
- for (int x = minX; x < width; x++) {
- int rgb = buffImg.getRGB(x, y);
- Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。
- Color newColor = new Color(255 - color.getRed(), 255 - color
- .getGreen(), 255 - color.getBlue());
- buffImg.setRGB(x, y, newColor.getRGB());
- }
- }
结果如图: 
3.再次是二值化,取图片的平均灰度作为阈值,低于该值的全都为0,高于该值的全都为255:
- for (int y = minY; y < height; y++) {
- for (int x = minX; x < width; x++) {
- int rgb = buffImg.getRGB(x, y);
- Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。
- int value = 255 - color.getBlue();
- if (value > average) {
- Color newColor = new Color(0, 0, 0);
- buffImg.setRGB(x, y, newColor.getRGB());
- } else {
- Color newColor = new Color(255, 255, 255);
- buffImg.setRGB(x, y, newColor.getRGB());
- }
- }
- }
结果如图: 
看看效果还凑合,就省却尺寸调整、中值滤波以及噪点去除等步骤了。
以上完成图片预处理工作;Tesseract没有开放api,纯命令行调用:
- List<String> cmd = new ArrayList<String>(); // 存放命令行参数的数组
- cmd.add(tessPath + "\\tesseract");
- cmd.add("");
- cmd.add(outputFile.getName()); // 输出文件位置
- cmd.add(LANG_OPTION); // 字符类别
- cmd.add("eng"); // 英文,找到tessdata里对应的字典文件。
- ProcessBuilder pb = new ProcessBuilder();
- pb.directory(imageFile.getParentFile());
- cmd.set(1, tempImage.getName()); // 把图片文件位置放在第一个位置
- pb.command(cmd); // 执行命令行
- pb.redirectErrorStream(true); // 通知进程生成器是否合并标准错误和标准输出,把进程错误保存起来。
- Process process = pb.start(); // 开始执行进程
- int w = process.waitFor(); // 当前进程停止,直到process停止执行,返回执行结果.
结果输出表示一切正常
当然,真正要用好tesseract-ocr,还需用到其强大地训练工具,就是后话了……
另外,关于文字识别,除去作为破解验证码的反制手段之外,我们是否也有相关的应用呢?

- 大小: 1.1 KB

- 大小: 1.3 KB

- 大小: 1.3 KB

- 大小: 1.4 KB
使用tesseract-ocr破解网站验证码的更多相关文章
- Keras入门(四)之利用CNN模型轻松破解网站验证码
项目简介 在之前的文章keras入门(三)搭建CNN模型破解网站验证码中,笔者介绍介绍了如何用Keras来搭建CNN模型来破解网站的验证码,其中验证码含有字母和数字. 让我们一起回顾一下那篇文 ...
- keras入门(三)搭建CNN模型破解网站验证码
项目介绍 在文章CNN大战验证码中,我们利用TensorFlow搭建了简单的CNN模型来破解某个网站的验证码.验证码如下: 在本文中,我们将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的 ...
- tesseract ocr训练 pt验证码
识别率有问题A大概率识别为n,因此需要训练,这里讲一下 如何训练 参考 java代码里边直接使用tess4j,是对tesseract的封装,但是如果要训练,还是需要在进行安装tesseract-ocr ...
- 【转】TensorFlow练习20: 使用深度学习破解字符验证码
验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册.灌水.发垃圾广告等等 . 验证码的作用是验证用户是真人还是机器人:设计理念是对人友好,对机 ...
- 文字识别还能这样用?通过Python做文字识别到破解图片验证码
前期准备 1. 安装包,直接在终端上输入pip指令即可: # 发送浏览器请求 pip3 install requests # 文字识别 pip3 install pytesseract # 图片处理 ...
- 用imagemagick和tesseract-ocr破解简单验证码
用imagemagick和tesseract-ocr破解简单验证码 Tesseract-ocr据说辨识程度是世界排名第三,可谓神器啊. 准备工作: 1.安装tesseract-ocr sudo apt ...
- Python脚本破解图形验证码(tesserocr和pytesseract)
在学习之前,我们先了解OCR.tesseract.tesserocr.pytesseract和opencv这几个跟图片处理有关的库. OCR(Optical Character Recognition ...
- Tesseract Ocr引擎
Tesseract Ocr引擎 1.Tesseract介绍 tesseract 是一个google支持的开源ocr项目,其项目地址:https://github.com/tesseract-ocr/t ...
- [转帖]web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。
web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全. https://www.cnblogs.com/1996V/p/7458377.html 感谢原作者写的内容 安全 ...
随机推荐
- 'htmlentities(): charset `utf8' not supported, assuming utf-8'
TP5.1框架报错! Fatal error: Uncaught exception 'think\exception\ErrorException' with message 'htmlentit ...
- cocos2dx跟eclipse交叉编译“make: * No rule to make target `all' Stop”的解决方案
cocos2dx和eclipse交叉编译“make: *** No rule to make target `all'. Stop”的解决方案 搞cocos2dx在eclipse上的交叉编译. 项目. ...
- 用sed替换文件中的空格
请教sed 替换问题 请教各位如何替换多个空格为一个字符,如一个文件中间隔符有是一个空格,有的地方是多个空格,想全部用“|”替换,如何处理,请指教 请教sed 替换问题 [code]sed '/ \+ ...
- IDEA基于maven整合SSM
感谢:IDEA搭建Spring+SpringMVC+mybatis框架教程 简洁明了, 步骤详细.
- HDUOJ----旋转的二进制
旋转的二进制 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- HDUOJ---2152
Fruit Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 【LeetCode】140. Word Break II
Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a senten ...
- laravel 5.1 添加第三方扩展库
步骤一:确定你要放第三方库的目录,假设:app/libs,并在该目录下放置类文件common.php.
- 深入浅出Android开发之Surface介绍
一 目的 本节的目的就是为了讲清楚Android中的Surface系统,大家耳熟能详的SurfaceFlinger到底是个什么东西,它的工作流程又是怎样的.当然,鉴于SurfaceFlinger的复杂 ...
- LeetCode总结 -- 一维数据合并篇
合并是一维数据结构中非经常见的操作, 一般是排序, 分布式算法中的子操作. 这篇总结主要介绍LeetCode中关于合并的几个题目: Merge Two Sorted ListsMerge Sorted ...