##前言
其实就是用到tesseract-ocr这个引擎来识别,只不过我们需要做一些在此之前的工作
将图片用pillow进行初步处理,将图片中的验证码显示的清晰一些,关于这些教程可以查看我的另一篇文章(现在还没写)
然后用tesseract-ocr将处理完的图片进行识别,当然不训练tesseract-ocr是不行的,还需要对其进行训练,后面我会说明怎么训练

windows 平台

1.安装

######安装tesseract-ocr
地址: 点我点我!
注意:如果你要识别中文的需要在安装时把中文包勾选上
######安装python第三方库
我这里用的是python3,python3怎么安装我就不多说了。
安装必要的 python第三方库:

pip install Pillow pytesseract -i https://mirrors.aliyun.com/pypi/simple/

Pillow是一个python图像处理的第三方库
pytesseract 我的理解是调用刚才安装的tesseract-ocr的一个接口吧
######安装训练矫正的工具(jTessBoxEditorFX)
地址:点我点我!

2.编写python处理图片函数

######二值化

from PIL import Image
from pytesseract import *
im = Image.open('1.jpg') #用pil打开这个图片 im = im.convert('L')
im = im.point(lambda x: 0 if x<100 else x>=100, '1') # 二值化 100为分割灰度的点(阀值),二值化就是将图片的颜色转换成非黑即白的图片
im.show() #查看图片

图片资源

经过上述处理应该这样的生成图片

如果显示的图片中线没有去掉,可以调整阀值来去掉线
######去除噪点
把图片中的黑点去掉

def getPixel(image,x,y):
L = image.getpixel((x,y)) #获取当前像素点的像素
if L == 0: #判读此像素点是否为黑,因为如果是白的就没必要处理了
nearDots = 0 #初始化记录周围有没有黑像素数量的值
#判断周围像素点
if L - image.getpixel((x - 1,y - 1)):
nearDots += 1
if L - image.getpixel((x - 1,y)):
nearDots += 1
if L - image.getpixel((x - 1,y + 1)):
nearDots += 1
if L - image.getpixel((x,y - 1)):
nearDots += 1
if L - image.getpixel((x,y + 1)):
nearDots += 1
if L - image.getpixel((x + 1,y - 1)):
nearDots += 1
if L - image.getpixel((x + 1,y)):
nearDots += 1
if L - image.getpixel((x + 1,y + 1)):
nearDots += 1
if nearDots ==8: #这里如果周围八个全是白点那么就返回一个白点,实现去黑点的操作
return 1
#这里主要是有俩个黑点连在一起,所有周围会有七个黑点扩大范围进一步判断
elif nearDots ==7:
nearDots = 0
if L - image.getpixel((x - 2,y - 2)):
nearDots += 1
if L - image.getpixel((x - 2,y)):
nearDots += 1
if L - image.getpixel((x - 2,y + 2)):
nearDots += 1
if L - image.getpixel((x,y - 2)):
nearDots += 1
if L - image.getpixel((x,y + 2)):
nearDots += 1
if L - image.getpixel((x + 2,y - 2)):
nearDots += 1
if L - image.getpixel((x + 2,y)):
nearDots += 1
if L - image.getpixel((x + 2,y + 2)):
nearDots += 1
if nearDots == 8:
return 1 #返回白点
else:
return 0 #返回黑点
else:
return 1 def clearNoise(image):
draw = ImageDraw.Draw(image)
#循环遍历每个像素点
for x in range(0,image.size[0]):
for y in range(0,image.size[1]):
color = getPixel(image,x,y)
draw.point((x,y),color) #将上一步处理完成的im对象传给clearNoise()函数
im = clearNoise(im)
im.show()

代码挺简单的应该可以看懂
不出意外的话处理完成的图片变成这样:

处理到这一步就已经可以了,当然你也可以进行进一步处理,例如局部放大
######调用 tesseract-ocr识别图片
在上面的代码中加入

# lang只用哪个库来识别 默认有个eng库,config 指代识别单行还是多行-psm 7只的是单行
result = pytesseract.image_to_string(im,lang='eng',config="-psm 7")
print(result)

不出意外的话识别结果应该是:o 3 o 4
但是我图像都已经处理到这一步了,怎么还识别出错??
答:因为你没有训练!

3.训练tesseract-ocr

######合成tif文件
打开安装的 Jtessboxedit ,点击tools——Merge TiFF然后选中经过处理的验证码图片(因为最终识别的是经过python处理完的,所以也拿处理完成的验证码来训练在原函数中加入im.save(保存路径)即可保存),随便找到另一个地方生成tif,命名为num.font.exp0.tif保存
注意:这里的文件名不是瞎起的,文件名有要求的,取和我相同的名字就行了,因为后面运行的命令都是依靠这个文件名的
######生成box文件
生成好后,进入tif文件所在的文件夹
运行命令

tesseract num.font.exp0.tif num.font.exp0 -psm 7 batch.nochop makebox

在文件夹就会生成一个 .box的文件
######训练
然后在jtessboxedit中Box Editor选项卡中点击open按钮打开上一步生成的tif文件

如果位置不对就调整x y,w,h的值,字符不对就修改字符,这里我把俩个o修改成0
然后save
######生成训练的库文件
进入到tif和box所在的文件夹
运行以下命令

tesseract.exe num.font.exp0.tif num.font.exp0 -psm 7 nobatch box.train
unicharset_extractor.exe num.font.exp0.box
echo font 0 0 0 0 0 > font_properties.txt
mftraining -F font_properties.txt -U unicharset -O num.unicharset num.font.exp0.tr
cntraining.exe num.font.exp0.tr
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable
combine_tessdata.exe num.

把生成的num.traineddata这个文件拷贝到 你的C:\Program Files (x86)\Tesseract-OCR\tessdata下,大工告成!

4.用训练好的库来识别python处理后的图片

只需修改一下代码即可

asd = pytesseract.image_to_string(image,lang='num',config="-psm 7")#将eng修改为你训练好的库,也就是num

备注: 评论有几个人问我代码,相关代码已经上次到CSDN了(资源名称为 python验证码识别), 原本我想上传到github, 但是我觉得我的github不能放这种半成品的代码, 所以很抱歉, 现在属于审核中, 后期审核通过我会把地址放上的

tesseract-orc训练 结合python3图像识别验证码的更多相关文章

  1. python 简单图像识别--验证码

    python  简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便( ...

  2. Python3 识别验证码(opencv-python)

    Python3 识别验证码(opencv-python) 一.准备工作 使用opencv做图像处理,所以需要安装下面两个库: pip3 install opencv-python pip3 insta ...

  3. tesseract 字体训练资料篇

    tesseract 字体训练资料篇 1.制作.box档案文件. tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] ...

  4. tesseract ocr训练 pt验证码

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

  5. tesseract图像识别验证码:安装使用和避免坑

    安装使用 https://blog.csdn.net/kk185800961/article/details/78747595 避免的坑 http://www.mamicode.com/info-de ...

  6. python图像识别--验证码

    1.pip3 install pyocr 2.pip3 install pillow or easy_install Pillow 3.安装tesseract-ocr:http://jaist.dl. ...

  7. 【Tesseract】Tesseract 的训练流程

    在泰迪杯A题中,我刚刚接触了Tesseact,其中训练字库中遇到了较多的问题.所以在此记录一下,也当做一个笔记,省得以后忘记. 为了方便 ,将tif命名格式设为[lang].[fontname].ex ...

  8. python3图像识别库安装与使用

    pytesseract库的安装 因为用的win10,就直说windows上面的安装了.其实就是pip安装就完事了. $ pip install pytesseract 安装了这个还不算完,得安装Tes ...

  9. Python3 简单验证码识别思路及实例

    1.介绍 在爬虫中经常会遇到验证码识别的问题,现在的验证码大多分计算验证码.滑块验证码.识图验证码.语音验证码等四种.本文就是识图验证码,识别的是简单的验证码,要想让识别率更高, 识别的更加准确就需要 ...

  10. OCR2:tesseract字库训练

    由于tesseract的中文语言包“chi_sim”对中文字体或者环境比较复杂的图片,识别正确率不高,因此需要针对特定情况用自己的样本进行训练,提高识别率,通过训练,也可以形成自己的语言库. 工具: ...

随机推荐

  1. 写个续集,填坑来了!关于“Thread.sleep(0)这一行‘看似无用’的代码”里面留下的坑。

    "我报名参加金石计划1期挑战--瓜分10万奖池,这是我的第2篇文章,点击查看活动详情" 你好呀,我是居家十三天只出了一次小区门的歪歪. 这篇文章是来填坑的,我以前写文章的时候也会去 ...

  2. Fast.Framework ORM 试用

    简介 Fast.Framework 是一款基于 .NET 6 封装的轻量级ORM框架,支持多种数据库(SQL Server.Oracle.MySQL.PostgreSQL.SQLite). 优点 性能 ...

  3. Windows 10无法显示无线网络连接

    最近刚刚升级了一下操作系统,升级到了1903版本.正好又有一个HP的打印机安装了一下.结果,发现居然无法管理无线网络了.如果看不到图,请点我. 右击选择连接,也无法显示SSID. 驱动是从这个官网下载 ...

  4. 前端 vue表格数据导出Excel 文件实现

    实现思路 使用json2csv将后台json数据转化为csv格式数据 采用创建Blob(二进制大对象)的方式来存放缓存数据: 生成下载链接: 创建一个a标签,设置href和download属性 触发a ...

  5. 第六章:Django 综合篇

    前面五章,已经将Django最主要的五大系统介绍完毕,除了这些主要章节,还有很多比较重要的内容,比如开发流程相关.安全.本地化与国际化.常见工具和一些框架核心功能.这些内容的篇幅都不大,但整合起来也是 ...

  6. Kibana控制台(Dev Tools) Console

    控制台插件提供一个用户界面来和 Elasticsearch 的 REST API 交互.控制台有两个主要部分: editor ,用来编写提交给 Elasticsearch 的请求: response ...

  7. Nginx缓存了DNS解析造成后端不通--代理

    文章转载自:https://segmentfault.com/a/1190000022365954 1 问题现象 我们使用 Nginx 的时候,经常会用到 Proxy 功能,为了方便管理,后端站点或者 ...

  8. Jenkins和Gitlab CI/CD自动更新k8s中pod使用的镜像说明

    Jenkins 使用Jenkins的话,完成的工作主要有如下步骤: 1.从Gogs或Gitlab仓库上拉取代码 2.使用Maven编译代码,打包成jar文件 3.根据jar文件使用相对应的Docker ...

  9. 内网横向渗透 之 ATT&CK系列一 之 信息收集

    前言 靶机下载地址:ATT&CK 拓扑图: 通过模拟真实环境搭建的漏洞靶场,完全模拟ATK&CK攻击链路进行搭建,形成完整个闭环.虚拟机默认密码为hongrisec@2019. 环境搭 ...

  10. NOI2014 洛谷P2114 起床困难综合征(位运算)

    呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该 ...