python3安装OCR识别库tesserocr过程图解
OCR简介
OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程,对应图形验证码来说,它们都是一些不规则的字符,这些字符是由字符稍加扭曲变换得到的内容,我们可以使用OCR技术来讲其转化为电子文本,然后将结果提取交给服务器,便可以达到自动识别验证码的过程。
window环境
环境材料准备
- Window10
- Python-3.7.3.tgz
- tesserocr安装包
安装tesserocr
1、打开链接,https://digi.bib.uni-mannheim.de/tesseract/,见下图。
下载最新版的tesseract-ocr-w64-setup-v5.0.0.20190623.exe,然后安装,本人直接安装在C盘目录下。安装完毕后,如下图。
配置环境变量,有两个步骤。
在系统变量里,修改path,如下图。
在系统变量里,创建一个新的变量名为:TESSDATA_PREFIX,值为:C:Program FilesTesseract-OCRtessdata(根据自己安装的tesserocr安装路径为准),如下图。
检查Tesseract-OCR是否安装完成,如下图。
Python3.7加载tesserocr
1、安装Python的OCR识别库
pip install Pillow pip install pytesseract
2、python加载Window的tesserocr应用,要修改pytesseract三方库的pytesseract.py脚本。
打开pytesseract.py,将Window的tesserocr应用的tesserocr.exe绑定好。
3、到这里Python的绑定window的tesserocr应用已经完成。
读取验证码图片
from PIL import Image
import pytesseract
def read_text(text_path):
"""
传入文本(jpg、png)的绝对路径,读取文本
:param text_path:
:return: 文本内容
"""
# 验证码图片转字符串
im = Image.open(text_path)
# 转化为8bit的黑白图片
imgry = im.convert('L')
# 二值化,采用阈值分割算法,threshold为分割点
threshold = 140
table = []
for j in range(256):
if j < threshold:
table.append(0)
else:
table.append(1)
out = imgry.point(table, '1')
# 识别文本
text = pytesseract.image_to_string(out, lang="eng", config='--psm 6')
return text
if __name__ == '__main__':
print(read_text("d://v3.png"))
输出:
读取中文文本图片
1、因为OCR读取不同语言需要加载语言包,因此需要下载简体中文语言包。 从这个链接下载:https://github.com/tesseract-ocr/tessdata,下载红圈的简体中文包。然后将此文件放置window的安装目录下。如下两个图。
现在,我们来读取如下图片的中文文本内容。
代码如下:
from PIL import Image
import pytesseract
def read_text(text_path):
"""
传入文本(jpg、png)的绝对路径,读取文本
:param text_path:
:return: 文本内容
"""
# 验证码图片转字符串
im = Image.open(text_path)
# 转化为8bit的黑白图片
imgry = im.convert('L')
# 二值化,采用阈值分割算法,threshold为分割点
threshold = 140
table = []
for j in range(256):
if j < threshold:
table.append(0)
else:
table.append(1)
out = imgry.point(table, '1')
# 识别文本,lang参数改为chi_sim,其他代码与上面的读取验证码代码一致。
text = pytesseract.image_to_string(out, lang="chi_sim", config='--psm 6')
return text
if __name__ == '__main__':
print(read_text("d://v7.png"))
以上就是本文的全部内容,希望对大家的学习有所帮助。
- Web开发常见的几个漏洞解决方法
- .Net多线程编程—同步机制
- .Net多线程编程—Parallel LINQ、线程池
- 没有自己的服务器如何学习生物数据分析(下篇)
- .Net多线程编程—并发集合
- .Net多线程编程—任务Task
- 学会WCF之试错法——安全配置报错分析
- 生物信息学技能面试题(第5题)-根据GTF画基因的多个转录本结构
- 学会WCF之试错法——超时
- 学会WCF之试错法——客户端调用基础
- 【直播】我的基因组58:用R包SNPRelate来对我的基因型跟hapmap计划数据比较
- 生物信息学技能面试题(第4题)-多个同样的行列式文件合并起来
- PHP 底层的运行机制与原理
- asp.net web api 版本控制
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 同样是空值,null和undefined有什么异同?
- 强大到没朋友的mysql-shell及插件
- android JavaPoet记录
- JavaScript里的分号,你加还是不加?
- 技术干货 | Docker 容器逃逸案例汇集
- 一张千万级别数据的表想做分页,如何优化?
- 一文学会爬虫技巧
- 为什么机器学习应用交易那么难(中)
- 消息队列的消费幂等性如何保证
- js中数组Array.reduce方法介绍及使用场景
- 推荐一套基于go开发的文档管理系统
- 如何通过容器搭建稳定可靠的私有网盘(NextCloud)
- Flutter实现倒计时功能
- Excelize 2.3.0 发布, Go 语言 Excel 基础库
- 网站渗透攻防Web篇之SQL注入攻击高级篇