python3光学字符识别模块tesserocr与pytesseract的使用详解


Posted in Python onFebruary 26, 2020

OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程,对应图形验证码来说,它们都是一些不规则的字符,这些字符是由字符稍加扭曲变换得到的内容,我们可以使用OCR技术来讲其转化为电子文本,然后将结果提取交给服务器,便可以达到自动识别验证码的过程

tesserocr与pytesseract是Python的一个OCR识别库,但其实是对tesseract做的一层Python API封装,pytesseract是Google的Tesseract-OCR引擎包装器;所以它们的核心是tesseract,因此在安装tesserocr之前,我们需要先安装tesseract

1、安装tesseract、tesserocr、pytesseract

(1)windows下的安装

下载tesseract:https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v4.0.0-beta.1.20180414.exe

或者本地下载:https://3water.com/softs/538925.html

然后双击程序安装即可,可以勾选Additional language data(download)选项来安装OCR识别支持的语言包,但下载语言包实在是慢,我们可以直接从https://github.com/tesseract-ocr/tessdata下载zip的语言包压缩文件,解压后将tessdata-master中的文件复制到Tesseract的安装目录C:\Program Files (x86)\Tesseract-OCR\tessdata目录下,最后我们配置下环境变量,我们将C:\Program Files (x86)\Tesseract-OCR添加到环境变量中

在测试之前先了解下tesseract的命令程序格式:

tesseract imagename outputbase [-l lang]

imagename指定图片名称,outputbase指定输出文件名,-l指定识别的语言

#显示安装的语言包
tesseract --list-langs

#显示帮助
tesseract --help
tesseract --help-extra
tesseract --version

进行测试:

#统计安装的语言包,安装了168个语言包
C:\Users\Administrator.DESKTOP-6JT7D2H>tesseract --list-langs | find /c /v ""
168

#使用一张图片测试,成功识别字符串
tesseract image.png result -l eng |type result.txt
Python3WebSpider

由于tesserocr在windows环境下会出现各种不兼容问题,并且与pycharm虚拟环境不兼容等问题,所以在windows系统环境下,选择pytesseract模块进行安装,如果实在要安装请使用whl文件安装或者使用conda安装

pip install pytesseract

如果在pytesseract运行是找不到tesseract解释器,这种情况一般是在虚拟环境下会发生,我们需要将tesseract-OCR的执行文件tesseract.ext配置到windows系统中的PATH环境中,或者修改pytesseract.py文件,将其中的“tesseract_cmd”字段指定为tesseract.exe的完整路径即可

测试识别功能:

import pytesseract
from PIL import Image

im=Image.open('image.png')
print(pytesseract.image_to_string(im))

(2)linux下的安装
在Ubuntu、Debian、Deepin系统中,安装命令如下:

#安装tesseract
sudo apt-get install -y tesseract-ocr libtesseract-dev libleptonica-dev

#安装语言包
git clone https://github.com/tesseract-ocr/tessdata.git
sudo mv tessdata/* /usr/share/tesseract-ocr/tessdata

#安装tesserocr
pip3 install tesserocr

#安装pytesseract
pip3 install pytesseract

在CentOS、Red Hat系统下,安装命令如下:

#安装tesseract
yum install -y tesseract

#安装语言包
git clone https://github.com/tesseract-ocr/tessdata.git
mv tessdata/* /usr/share/tesseract/tessdata

#安装tesserocr
pip3 install tesserocr

#安装pytesseract
pip3 install pytesseract

测试安装环境:

In [1]: import tesserocr
In [2]: from PIL import Image
In [3]: im=Image.open('image.png')
In [4]: tesserocr.image_to_text(im)
Out[4]: 'Python3WebSpider\n\n'

tesserocr安装参考链接:https://github.com/sirfz/tesserocr

pytesseract安装参考链接:https://github.com/madmaze/pytesseract

tesseract安装参考链接:https://github.com/tesseract-ocr/tesseract/wiki

2、tesserocr与pytesseract模块的使用

(1)tesserocr的使用

#从文件识别图像字符
In [7]: tesserocr.file_to_text('image.png')
Out[7]: 'Python3WebSpider\n\n'

#查看tesseract已安装的语言包
In [8]: tesserocr.get_languages()
Out[8]: ('/usr/share/tesseract/tessdata/', ['eng'])

#从图片数据识别图像字符
In [9]: tesserocr.image_to_text(im)
Out[9]: 'Python3WebSpider\n\n'

#查看版本信息
In [10]: tesserocr.tesseract_version()
Out[10]: 'tesseract 3.04.00\n leptonica-1.72\n libgif 4.1.6(?) : libjpeg 6b (libjpeg-turbo 1.2.90) : libpng 1.5.13 : libtiff 4.0.3 : zlib 1.2.7 : libwebp 0.3.0\n'

(2)pytesseract使用

功能:

  • get_tesseract_version

    返回系统中安装的Tesseract版本。

  • image_to_string

    将图像上的Tesseract OCR运行结果返回到字符串

  • image_to_boxes

    返回包含已识别字符及其框边界的结果

  • image_to_data

    返回包含框边界,置信度和其他信息的结果。需要Tesseract 3.05+。有关更多信息,请查看Tesseract TSV文档

  • image_to_osd

    返回包含有关方向和脚本检测的信息的结果。

参数:

image_to_data(image, lang=None, config='', nice=0, output_type=Output.STRING)

  • image object

    图像对象

  • lang String,Tesseract

    语言代码字符串

  • config String

    任何其他配置为字符串,例如:config='--psm 6'

  • nice Integer

    修改Tesseract运行的处理器优先级。Windows不支持。尼斯调整了类似unix的流程的优点。

  • output_type

    类属性,指定输出的类型,默认为string。有关所有支持类型的完整列表,请检查pytesseract.Output类的定义。

from PIL import Image
import pytesseract

#如果PATH中没有tesseract可执行文件,请指定tesseract路径
pytesseract.pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\\tesseract.exe'

#打印识别的图像的字符串
print(pytesseract.image_to_string(Image.open('test.png')))

#指定语言识别图像字符串,eng为英语
print(pytesseract.image_to_string(Image.open('test-european.jpg'), lang='eng'))

#获取图像边界框
print(pytesseract.image_to_boxes(Image.open('test.png')))

#获取包含边界框,置信度,行和页码的详细数据
print(pytesseract.image_to_data(Image.open('test.png')))

#获取方向和脚本检测
print(pytesseract.image_to_osd(Image.open('test.png'))

3、图像识别简单应用

 一般图像处理验证,需要通过对图像进行灰度处理、二值化后增加图像文字的辨识度,下面是一个简单的对图像验证码识别处理,如遇到复杂点的图像验证码如中间带多条同等大小划线的验证码需要对文字进行乔正切割等操作,但它的识别度也只有百分之30左右,所以得另外想别的办法来绕过验证

from PIL import Image
import pytesseract

im = Image.open('66.png')
#二值化图像传入图像和阈值
def erzhihua(image,threshold):
  ''':type image:Image.Image'''
  image=image.convert('L')
  table=[]
  for i in range(256):
    if i < threshold:
      table.append(0)
    else:
      table.append(1)
  return image.point(table,'1')


image=erzhihua(im,127)
image.show()

result=pytesseract.image_to_string(image,lang='eng')
print(result)

模拟自动识别验证码登陆:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2018/7/13 8:58
# @Author : Py.qi
# @File  : login.py
# @Software: PyCharm
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,WebDriverException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.remote.webelement import WebElement
from io import BytesIO
from PIL import Image
import pytesseract
import time

user='zhang'
password='123'
url='http://10.0.0.200'
driver=webdriver.Chrome()
wait=WebDriverWait(driver,10)

#识别验证码
def acker(content):
  im_erzhihua=erzhihua(content,127)
  result=pytesseract.image_to_string(im_erzhihua,lang='eng')
  return result

#验证码二值化
def erzhihua(image,threshold):
  ''':type image:Image.Image'''
  image=image.convert('L')
  table=[]
  for i in range(256):
    if i < threshold:
      table.append(0)
    else:
      table.append(1)
  return image.point(table,'1')

#自动登陆
def login():
  try:
    driver.get(url)
    #获取用户输入框
    input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#loginname'))) #type:WebElement
    input.clear()
    #发送用户名
    input.send_keys(user)
    #获取密码框
    inpass=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#password'))) #type:WebElement
    inpass.clear()
    #发送密码
    inpass.send_keys(password)
    #获取验证输入框
    yanzheng=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#code'))) #type:WebElement
    #获取验证码在画布中的位置
    codeimg=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#codeImg'))) #type:WebElement
    image_location = codeimg.location
    #截取页面图像并截取掩码码区域图像
    image=driver.get_screenshot_as_png()
    im=Image.open(BytesIO(image))
    imag_code=im.crop((image_location['x'],image_location['y'],488,473))
    #输入验证码并登陆
    yanzheng.clear()
    yanzheng.send_keys(acker(imag_code))
    time.sleep(2)
    yanzheng.send_keys(Keys.ENTER)
  except TimeoutException as e:
    print('timeout:',e)
  except WebDriverException as e:
    print('webdriver error:',e)

if __name__ == '__main__':
  login()

参考链接:

tesserocr GitHub:https://github.com/sirfz/tesserocr

tesserocr PyPI:https://pypi.python.org/pypi/tesserocr

pytesserocr GitHub:https://github.com/madmaze/pytesseract

pytesserocr PyPI:https://pypi.org/project/pytesseract/

tesseract下载地址:http://digi.bib.uni-mannheim.de/tesseract

tesseract GitHub:https://github.com/tesseract-ocr/tesseract

tesseract 语言包:https://github.com/tesseract-ocr/tessdata

tesseract文档:https://github.com/tesseract-ocr/tesseract/wiki/Documentation

到此这篇关于python3光学字符识别模块tesserocr与pytesseract的使用详解的文章就介绍到这了,更多相关python3 tesserocr pytesseract内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Python 相关文章推荐
打开电脑上的QQ的python代码
Feb 10 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
Python后台开发Django会话控制的实现
Apr 15 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
Python unittest单元测试框架实现参数化
Apr 29 Python
编写python代码实现简单抽奖器
Oct 20 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 Python
Python中if有多个条件处理方法
Feb 26 #Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 #Python
Python处理PDF与CDF实例
Feb 26 #Python
用Python绘制漫步图实例讲解
Feb 26 #Python
Django单元测试中Fixtures的使用方法
Feb 26 #Python
python 解压、复制、删除 文件的实例代码
Feb 26 #Python
Python递归调用实现数字累加的代码
Feb 25 #Python
You might like
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
js的写法基础分析
2011/01/17 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
Python自动登录126邮箱的方法
2015/07/10 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
Python常见数字运算操作实例小结
2019/03/22 Python
基于python实现把图片转换成素描
2019/11/13 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
天巡全球:Skyscanner Global
2017/06/20 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
自考生自我鉴定范文
2013/10/01 职场文书
财务分析个人的自荐书范文
2013/11/24 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
社团个人总结范文
2015/03/05 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
Pandas 稀疏数据结构的实现
2021/07/25 Python
Golang ort 中的sortInts 方法
2022/04/24 Golang