python+tesseract验证码识别的一点小心得

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

我选用的是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, ‘1‘)
    return out

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

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

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

归一化

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

腐蚀算法请自行谷歌。

第二步对验证码进行切割

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

目前我只研究了这几种

垂直像素直方图

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

平均分割法

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

波谷分割法

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

滴水算法

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

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

第三步对验证码进行识别

终于到了重头戏了

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

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

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

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

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

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

以下摘自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



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里面的填充功能。

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

时间: 2024-12-23 20:12:33

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

一点小心得

项目中会遇到这样的逻辑处理:根据不同类型调用不同的方法,通常会用到if else等语句,感觉不太好: 1,应该面向接口编程 2,尽量避免使用if语句 实例:原来代码,接口Iservice的实现类有 ServiceA ,ServiceB,ServiceC public static void main(String[] args) { String type = "C"; Iservice service = null; if (type.equals("A")) {

学习KMP算法的一点小心得

KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词:暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个:这样算法复杂度最坏就达到了O(m*n),对于大数据肯定不行.KMP算法的精髓即设法减少不必要的枚举次数,举个例子:比如已经匹配好了单词的前k-1个字母:但第k个字母无法匹配了:那么如果前k-1个字母中存在类似回文的情况(前i个字母组成的子串和后i个字母组成的子串相同),那么指针j就变成i(相当于整体往右移动),这样来达到减少枚举次数的目

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

转载:@小五义http://www.cnblogs.com/xiaowuyi 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类是图片处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别.不管是用什么方法,都需要首先对图片进行处理,于是试着对下面的验证码进行分析.        一.图片处理 这个验证码中主要的影响因素是中间的曲线,首先考虑去掉图片中的曲线.考

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

N天前实现了简单的验证识别,这玩意以前都觉得是高大上的东西,一直没有去研究,这次花了点时间研究了一下,当然只是一些基础的东西,高深的我也不会,分享一下给大家吧. 关于python验证码识别库,网上主要介绍的为pytesser及pytesseract,其实pytesser的安装有一点点麻烦,所以这里我不考虑,直接使用后一种库. 要安装pytesseract库,必须先安装其依赖的PIL及tesseract-ocr,其中PIL为图像处理库,而后面的tesseract-ocr则为google的ocr识别

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

0.目录 1.参考2.没事画个流程图3.完整代码4.改进方向 1.参考 https://en.wikipedia.org/wiki/Cosine_similarity https://zh.wikipedia.org/wiki/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E6%80%A7 Cosine similarityGiven two vectors of attributes, A and B, the cosine similarity, cos(θ),

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

前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误导大家.. 今天这篇也不是讲Core的 前面写了C#开发移动应用系列  就第一篇和最后一篇上了最多推荐 - -  也许大家确实不看好吧.. 算了..废话不多说.开始今天的东西吧.. 本篇文章不讲为何我们要用IOC..只讲Autofac使用中的一些小心得 正文 1.基本注入 首先我们要构造一个容器,代码如下: //第一步: 构造一个Auto

python 豆瓣验证码识别总结

总结:  pytesseract 识别比较标准的图片  识别成功率   还是不错的. 验证码的图片识别 需要先处理好   再用pytesseract 识别 from PIL import Image  # 图片处理import pytesseract  #  识别 im = Image.open('/home/yuexinpeng/profit.jpg')out = imaa = pytesseract.image_to_string(out)print(aa) # 滤波处理 去掉背景色thre

卷积学习的一点小心得

在信号的时域分析中,最为重要的就是信号通过线性时不变系统,即时域卷积计算.先来回顾一下线性时不变系统的定义: \[ \begin{array}{l} If{\rm{ }}x(t) \Rightarrow y(t){\rm{ :}}\a{x_1}(t) + b{x_2}(t) \Rightarrow a{y_1}(t) + b{y_2}(t)\x(t - {t_0}) \Rightarrow y(t - {t_0}) \end{array} \tag{1-1} \] 物理可实现的系统绝大多数均满足

软件测试管理的一点小心得

某甲问道:「测试做太多的话,会不会使得bug解不完?」 某乙回答:「还不简单.只要不做测试,就没有bug.」 上述对话,反应出许多软件工作人员对于测试的想法.对多数软件开发人员而言,测试大概是仅次于维护之外,最令人讨厌的工作.对软件研发主管来说,测试是必要之恶:做得不够后患无穷,做得过多又增加成本,延误商机.因此,如何能够规画与执行一个最经济有效的测试工作,当是软件研发主管们须研究的一个课题. 软件测试的困难,在于它不仅是产品的测试,更是产品设计程序的检验.由于关乎设计的测试,准则不易寻找,经验