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

Tesseract-ocr据说辨识程度是世界排名第三,可谓神器啊。

准备工作:

1.安装tesseract-ocr

  1. sudo apt-get install tesseract

2.安装imagemagick

  1. sudo apt-get install imagemagick

3.安装rmagick

  1. sudo apt-get remove --purge librmagick-ruby-doc librmagick-ruby1.8
  2. sudo apt-get install libmagick9-dev ruby1.8-dev
  3. sudo gem install rmagick

先试一个简单的:

  1. require 'rubygems'
  2. require 'rtesseract'
  3. img = RTesseract.new("tmp/test.jpg")
  4. img.to_s.sub(/\s+$/, "") # => "3R8Z"

很成功,但这个太简单了。一般破解复杂点的验证码处理步骤是先用imagemagick灰度化,灰度反转,提高对比度,二值化等。然后再用ocr去识别。ocr识别黑白图片效果比较好些。

这个是人民网的验证码:

  1. img = MiniMagick::Image.new("tmp/people.jpg")
  2. img.colorspace("GRAY")#灰度化
  3. image = RTesseract.new(img.path)
  4. image.to_s.sub(/\s+$/, "") # => "254369"

这个还是简单,再复杂一点的,这个是4399.com的验证码:

有黑色边框,有背景色,文字稍微扭曲。

  1. img = MiniMagick::Image.new("tmp/4399.jpg")
  2. img.crop("#{img[:width] - 2}x#{img[:height] - 2}+1+1") #去掉边框(上下左右各1像素)
  3. img.colorspace("GRAY") #灰度化
  4. img.monochrome #二值化
  5. image = RTesseract.new(img.path) #ocr识别
  6. image.to_s.sub(/\s+$/, "") #=> "5692"

像上面这样简单的识别率几乎能达到80%以上,扭曲太严重的识别率就很低了。有轻微噪点的就得自己写去噪算法了。。

还有一些验证码看起来很变态但是是纸老虎。像当当的。刷新了几次发现结果在1-20之间,选中一个数暴力破解每次也有1/20正确的概率。

还有139的:。答案就12种1-4A-Da-d。而且不区分大小写。选中一个字母每次有1/6的概率命中。

下载jTessBoxEditor用于修改box文件
下载地址:http://download.csdn.net/detail/a443475601/5896893 里面自带java运行库,安装后 然后启动命令行 java -jar jTessBoxEditor.jar即可打开

为了方便 tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言 fontname是字体 
比如我们要训练自定义字库 chi 字体名:黑体
那么我们把tif文件重命名 chi.黑体.exp0.tif
把多个.tif文件合并成一个.tif文件合并成一个.tif文件

下面开始训练字库:

下面第一条命令与上图功能一样,产生.box文件
1、E:\Tesseract-ocr\tesseract.exe chi.黑体.exp0.tif chi.黑体.exp0 batch.nochop makebox

运行以上命令也会产生一个box文件。产生box文件的过程是必须的,也是最重要的,没有box文件以下的内容都无法进行。

需要记住的是生成的.box要和这个.tif文件同在一个目录下。

2、文字校正。运行jTessBoxEditor工具,打开chi.黑体.exp0.tif文件(必须将上一步生成的.box和.tif样本文件放在同一目录),如上图所示。可以看出有些字符识别的不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正。校正完成后保存即可。

2、产生字符特征文件

   tesseract chi.黑体.exp0.tif chi.黑体.exp0 nobatch box.train

这一步将会产生 chi.黑体.exp0.tr文件和一个 chi.黑体.exp0.txt文件,txt文件貌似没什么用,看看而以。

3、计算字符集

   unicharset_extractor chi.黑体.exp0.box

这一步会产生一个unicharset字符集文件.

4、定义字体特征文件,---Tesseract-OCR3.01以上的版本在训练之前需要创建一个名称为font_properties.txt的字体特征文件

手工建立一个文件font_properties.txt

内容如:黑体 0 0 0 0 0

注意:这里   必须与训练名中的名称保持一致,填入下面内容 ,这里全取值为0,表示字体不是粗体、斜体等等。

5、聚集字符特征

1) shapeclustering -F font_properties.txt -U unicharset chi.黑体.exp0.tr   注意:如果font_properties不加扩展名.txt,可能会报错

2) mftraining -F font_properties.txt -U unicharset -O chi.unicharset chi.黑体.exp0.tr

使用上一步产生的字符集文件unicharset,来生成当前新语言的字符集文件chi.unicharset。同时还会产生图形原型文件inttemp和每个字符所对应的字符

特征数文件pffmtable。最重要的就是这个inttemp文件了,他包含了所有需要产生的字的图形原型。

   3)cntraining chi.黑体.exp0.tr

这一步产生字符形状正常化特征文件normproto。

6、把目录下的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件前面都加上chi.

7、执行combine_tessdata chi.

然后把chi.traineddata放到tessdata目录

必须确定的是第2、4、5、6行的数据不是-1,那么一个新的字典就算生成了.

8、用新的字库对图片进行分析

tesseract test.tif output -l chi

内容会写到output.txt文件中,这个文件与测试图片在同一个目录下

识别问题:

1、一个字分成2部分识别,如:好,会认为女  子,如何解决???

用imagemagick和tesseract-ocr破解简单验证码的更多相关文章

  1. tesseract ocr训练 pt验证码

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

  2. 使用ImageMagick和Tesseract进行简单数字图像识别

    使用ImageMagick和Tesseract进行简单数字图像识别 由于直接使用 tesseract 进行识别,识别率很低, ImageMagick 安装.配置及使用: 平台:winXP 1. 安装I ...

  3. python+selenium十三:破解简单的图形验证码

    此方法可破解简单的验证码,如: 注:中文识别正在寻找办法 安装: 1.python3 2.Pillow 3.pytesseract 4.tesseract-ocr    下载地址:https://pa ...

  4. Python&selenium&tesseract自动化测试随机码、验证码(Captcha)的OCR识别解决方案参考

    在自动化测试或者安全渗透测试中,Captcha验证码的问题经常困扰我们,还好现在OCR和AI逐渐发展起来,在这块解决上越来越支撑到位. 我推荐的几种方式,一种是对于简单的验证码,用开源的一些OCR图片 ...

  5. 转:关于使用ImageMagick和Tesseract进行简单数字图像识别

    据说Tesseract可是世界排名第三的OCR神器,2010年又更新了3.0版本.Tesseract原先是HP写的,现在Open Source了. 下面介绍怎么用Tesseract配合ImageMag ...

  6. Tesseract OCR简单实用介绍

    做字符识别,不能不了解google的Tesseract-OCR,但是如何在自己的工程中使用其API倒是语焉不详,官网上倒是很详尽地也很啰嗦地介绍如何重新编译生成适合自己平台的lib和dll,经过近些天 ...

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

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

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

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

  9. 简单验证码识别 tessnet2

    今天突然间对识别验证码感兴趣,于是网上搜了一下 最简单的是引用tessnet2.dll,然后通过它来识别,代码如下 private void button1_Click(object sender, ...

随机推荐

  1. Qt窗口部件及子部件

    QWidget类是所有用户界面对象的基类,被称为基础窗口部件. #include <QApplication> #include<QLabel> #include<QWi ...

  2. Interview-Harry Potter walk through matrix.

    假设你是harry potter,在grid的左上角,你现在要走到右下角,grid中有正数也有负数,遇到正数表示你的strength增加那么多,遇到负数表示strength减少那么多,在任何时刻如果你 ...

  3. 路由器开发板上的TTL线连接方法

    手头有个MTK双频路由器的开发板,做工良好,但让人蛋疼的是,TTL线没有标注TX/RX/GND/VCC,这个小细节的缺失给使用带来了巨大麻烦.   网上搜了半天也没找到相关电路图,只好遍历测试找到正确 ...

  4. C# 浅谈委托----温故而知新

    先看看委托的概述: •委托类似于 C++ 函数指针,但它们是类型安全的. • 委托允许将方法作为参数进行传递. • 委托可用于定义回调方法. • 委托可以链接在一起:例如,可以对一个事件调用多个方法. ...

  5. 被git extensions给坑了,Not owner 解决办法

    我只遇到这一种情况,不能访问git文件主库, 清空以前的历史文件,包括默认配置文件,重新安装一遍git extension,然后设置账号和密码, 在打开bash设置私钥和公钥 把公钥添加到你的git的 ...

  6. 如何在Eclipse中配置Tomcat服务器

    之前使用MyEclipse来开发Web应用,可以在MyEclipse中配置服务器,配置完后,直接运行服务器即可,很方便. 最近切换到Eclipse开发环境,发现使用Tomcat的方式不太一样,因此在此 ...

  7. js获取时间

    var myDate = new Date(); console.log(myDate.toLocaleString()); function getNowFormatDate() { var dat ...

  8. 无废话网页重构系列——(7)布局(区块、栅格)、模块组件(module)

    本文作者:大象本文地址:http://www.cnblogs.com/daxiang/p/4654800.html 在构建HTML主干结构后,开始编写“页面布局”和“模块组件”: 页面框架由几个主干结 ...

  9. error X3025:global variables are implicitly constant, enable compatibility mode to allow modification

    global variables are implicitly constant, enable compatibility mode to allow modification http://xbo ...

  10. 深入理解Tornado——一个异步web服务器

    本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...