由于公司需要,最近开始学习验证码的识别

我选用的是tesseract-ocr进行识别,据说以前是惠普公司开发的排名前三的,现在开源了。到目前为止已经出到3.0.2了

当然了,前期我们还是需要对验证码进行一些操作,让他对机器更友好,这样才能提高识别率。

步骤基本上是这样的

第一步对验证码进行灰度图以及二值化

需要用到pil库可以pip下载

代码如下

def binarization(image):
#转成灰度图
imgry = image.convert('L')
#二值化,阈值可以根据情况修改
threshold = 128
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
out = imgry.point(table, '')
return out

接着是去噪,因为我研究的验证码基本不需要去噪,所以省略,需要去噪的小伙伴们,请自行谷歌。

还有倾斜度调整,推荐使用旋转卡壳算法

原理是对图片进行-30度到30度的旋转,宽度最大的一般就是正的了。(网上这样说的,我试过了,对大部分是可以,小部分如c啥的貌似效果不好)

归一化

可以用腐蚀算法对验证码进行细化

腐蚀算法请自行谷歌。

第二步对验证码进行切割

对不同的验证码有不同的算法

目前我只研究了这几种

垂直像素直方图

原理是根据每个x的黑块数量进行切割,黑块数量大于某个值开始切割,小于某个值结束切割。适用于验证码之间有间隔或者间隔较大的,对那种粘连在一起的验证码效果不好。

平均分割法

原理是找到黑块开始出现的x,y轴和黑块不出现的x,y轴,切割。然后平均分割成n等分。适用于验证码大小比较固定的,对粘连在一起的验证码效果比上一种方法要好一点。

波谷分割法

原理和垂直像素直方图类似,记录每个x的黑块数量,找到局部的极小值,切割。适用于验证码之间有间隔或者间隔较大的,对那种粘连在一起的验证码效果比垂直像素直方图要好。

滴水算法

原理是模拟水滴的流动,记录水滴的流动路径,然后进行切割。要注意的是,起始点的确定很重要,对那种粘连在一起的验证码效果很好。

以上的四种算法以后我会将代码贴在另一个随笔里

第三步对验证码进行识别

终于到了重头戏了

需要导入pytesser,调用image_to_string(image)即可识别。

不过识别率实在是低的可怜。

所以需要我们对机器进行训练。

下面简要介绍下如果对机器进行训练。

首先下载tesseract-ocr,必须的没有怎么识别对吧。

找尽量多的验证码,最好是二值化后的或者按照上面的步骤切割下来的。

下载jTessBoxEditor选择Tools中的merge-tiff,选择要训练的图片,按下shift选择多个,然后保存起来名字如下[lang].[fontname].exp[num].tif

生成 .box文件 
tesseract ec.ufont.exp0.tif ec.ufont.exp0 batch.nochop makebox

然后可以通过jTessBoxEditor的Box Editor进行调整可以一张张调整。

以下摘自http://www.cnblogs.com/wolfray/p/5547267.html

为了方便 ,将tif命名格式设为[lang].[fontname].exp[num].tif 
lang是语言 
fontname是字体 
比如我们要训练自定义字库 ec 字体名:unfont 
那么我们把tif文件重命名 ec.ufont.exp0.tif

生成 .box文件 
tesseract ec.ufont.exp0.tif ec.ufont.exp0 batch.nochop makebox 
使用训练过的字库生成.box文件 
tesseract ec.ufont.exp0.tif ec.ufont.exp0 -l ufont batch.nochop makebox

然后写一个脚本批量运行以下命令

脚本内容如下

num.font.exp0.tif应该改成你自己的文件名字

rem 执行改批处理前先要目录下创建font_properties文件  

echo Run Tesseract for Training..
tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train echo Compute the Character Set..
unicharset_extractor.exe num.font.exp0.box
mftraining -F font_properties.txt -U unicharset -O num.unicharset num.font.exp0.tr echo Clustering..
cntraining.exe num.font.exp0.tr echo Rename Files..
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable echo Create Tessdata..
combine_tessdata.exe num.

1. 产生字符特征文件 .tr

tesseract ec.ufont.exp0.tif ec.ufont.exp0 nobatch box.train 
这一步将会产生 ec.ufont.exp0.tr文件和一个 ec.ufont.exp0.txt文件,txt文件貌似没什么用,看看而以。

2.计算字符集(生成unicharset文件) 
unicharset_extractor ec.ufont.exp0.box

3.定义字体特征文件 
—Tesseract-OCR3.01以上的版本在训练之前需要创建一个名称为font_properties.txt的字体特征文件 
手工建立一个文件font_properties.txt 
内容如:ufont 0 0 0 0 0 
注意:这里 必须与训练名中的名称保持一致,填入下面内容 ,这里全取值为0,表示字体不是粗体、斜体等等。

4.聚集字符特征 
1) shapeclustering -F font_properties.txt -U unicharset ec.ufont.exp0.tr 
注意:如果font_properties不加扩展名.txt,可能会报错 
2) mftraining -F font_properties.txt -U unicharset -O ufont.unicharset ec.ufont.exp0.tr 
使用上一步产生的字符集文件unicharset,来生成当前新语言的字符集文件ec.unicharset。同时还会产生图形原型文件inttemp和每个字符所对应的字符 
特征数文件pffmtable。最重要的就是这个inttemp文件了,他包含了所有需要产生的字的图形原型。 
3)cntraining ec.ufont.exp0.tr 
这一步产生字符形状正常化特征文件normproto。 
shapeclustering 操作不是必须的,若没有进行此步,在mftraining的时候 会自动进行。 
5.改名字 
把目录下的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件前面都加上ufont.

6.执行combine_tessdata ufont. 
然后把ufont.traineddata放到tessdata目录

7.测试 
必须确定的是第type 1、3、4、5的数据不是-1,那么一个新的字典就算生成了。 
tesseract ec.ufont.exp0.tif papapa -l ufont

tesseract也提出,通过使用多个语言训练库联合使用。如此,新的字体训练库也可以与原有的数据训练库联合使用。如参数 -l 之后 tesseract input.tif output -l eng+newfont。

cntraining和mftraining只能最多采用32个.tr文件,因此,对于相同的字体,你必须从多种语言中,以字体独立的方式,将所有的文件cat到一起来让32种语言结合在一起。cntraining/mftraining以及unicharset_extractor命令行工具必须各自由给定的.tr和.box文件,以相同的顺序,为不同的字体进行不同的过滤。可以提供一个程序来完成以上的事情,并在字符集表中挑出相同字符集。这样会将事情更简单些。 
写批处理bat命令的时候,要灵活使用excel里面的填充功能。

最后记录下训练时遇到的问题

tesseract.exe eng.font.exp0.tif eng.font.exp0 nobatch box.train

运行上述命令是可能会遇到could not find a matching blob问题

请调整你的box大小,或者更换图片

在此随便解释下box里面的值的含义

第一个是识别出的值+空格+box起始x坐标+空格+不知道什么鬼的坐标,貌似不是起始y坐标+空格+box终点x坐标即起始x坐标加上宽度+空格+起始y坐标加上高度

一般来说如果调整了box大小都还报错的话,建议换图

另一个问题是运行

mftraining -F font_properties -U unicharset eng.font.exp0.tr

会报错

改成运行

mftraining -F font_properties.txt -U unicharset eng.font.exp0.tr

就是font_proerties加上.txt

在这里感谢下很多大神在网站的解答和记录,对我的学习起了很大的作用。谢谢。

python+tesseract验证码识别的一点小心得的更多相关文章

  1. Mac python Tesseract 验证码识别

    Tesseract 简介 Tesseract(/'tesərækt/) 这个词的意思是"超立方体",指的是几何学里的四维标准方体,又称"正八胞体".不过这里要讲 ...

  2. BUI Webapp用于项目中的一点小心得

    接触BUI也有一段时间,也用在了移动端的项目开发中,总的来说,该框架用起来也挺灵活的,控件可以自由定制,前提是自己能认真地学习该框架的api,因为api里面说的东西比较详细,如果没有仔细看的,可能有些 ...

  3. 关于利用python进行验证码识别的一些想法

    转载:@小五义http://www.cnblogs.com/xiaowuyi 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类: ...

  4. Python - PIL-pytesseract-tesseract验证码识别

    N天前实现了简单的验证识别,这玩意以前都觉得是高大上的东西,一直没有去研究,这次花了点时间研究了一下,当然只是一些基础的东西,高深的我也不会,分享一下给大家吧. 关于python验证码识别库,网上主要 ...

  5. Python之验证码识别功能

    Python之pytesseract 识别验证码 1.验证码来一个 2.适合什么样的验证码呢? 只能识别简单.静态.无重叠.只有数字字母的验证码 3.实际应用:模拟人工登录.页面内容识别.爬虫抓取信息 ...

  6. ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)

    前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误导大家.. 今天这篇也不是讲Core的 ...

  7. python之验证码识别 特征向量提取和余弦相似性比较

    0.目录 1.参考2.没事画个流程图3.完整代码4.改进方向 1.参考 https://en.wikipedia.org/wiki/Cosine_similarity https://zh.wikip ...

  8. Qt使用com组件的一点小心得(使用Qt自带的工具dumpcpp生成.h和.cpp文件)

    这几天工作中要用到Qt调用com组件,主要用到的类型有dll和ocx,使用他们的方法很简单:1.将com组件注册到系统中.2.使用Qt自带的工具dumpcpp将com组件生成cpp和头文件.3.然后就 ...

  9. python语言验证码识别,以后不用老输入验证码了。

    1.Python 3.6 安装包 1.要加环境变量 2.pip安装PIL库 3.pip安装pytesseract模块 2.tesseract-ocr-setup-4.00.00dev.exe   -- ...

随机推荐

  1. sql注入过滤了#,--+怎么办

    题目是NCTF2018的web题目 第一段是错误的思路,第二段是晚上有思考后发现的直接看第二段吧. ① ?id=1'会直接出来报错提示. 猜测使用单引号保护id. 另外一打空格就提示you hacke ...

  2. c#之线程同步--轻量级同步 Interlocked

    轻量级同步 Interlock 为什么说它是轻量级呢?因为它仅对整形数据(即int类型,long也行)进行同步. 如果你学过操作系统里面的PV操作(即信号量),那么你对它已经了解了一般.它实现的正是如 ...

  3. How Ironic Inspector Works

    翻译官网概述. 操作员将节点注册为Ironic,例如 通过openstack baremetal CLI命令. 电源管理认证应该在这一步提供给Ironic. 如节点状态所述,节点被置于正确的自省状态. ...

  4. Java 语言概述与开发环境(2)

    目录: 一.JDK配置容易出现的问题 二.HelloWorld程序编译常见问题 三.文档注释 四.Java 标识符 五.转义符 六.运算符之算术运算符   ********************** ...

  5. 聊聊、CA机构认证CSR生成

    https://search.thawte.com/support/ssl-digital-certificates/index?page=content&id=SO832 https://s ...

  6. 考研心得--一个差劲的ACMer

    考研心得   --ACMer(山东工商学院) 2019年2月20日星期三(正月十六),打开QQ音乐,播放<告别都市>,应同学要求,也是给自己奋斗一年多时间的“考研大业”一个交代,写下这篇考 ...

  7. 【转】Apache Thrift - 可伸缩的跨语言服务开发框架

    Apache Thrift - 可伸缩的跨语言服务开发框架 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详 ...

  8. SOCK5代理服务器

    SOCK5代理服务器 简单介绍下比较好用的代理服务器,在部署过程中在内外网访问,需要切网比较麻烦,所以可以在互联网区部署sock5代理,通过配置代理切换服务器, 比较方便配置,节省时间. 官网: ht ...

  9. redis学习(五)事务

    事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. 1.事务基本命令: multi:标记一个事务块的开始 exec:执行所 ...

  10. Linux基础值定时任务

    Linux计划任务:列行公事 在Linux中,通过crontab与at这两个来实现这些功能 at:是一个可以处理仅执行一次就结束的指令 crontab:把你指定的工作或任务,按照你设定的周期一直循环执 ...