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 相关文章推荐
python映射列表实例分析
Jan 26 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
python通过zabbix api获取主机
Sep 17 Python
python将txt文件读取为字典的示例
Dec 22 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python实现腾讯滑块验证码识别
Apr 27 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与jquery设置和读取cookies
2013/08/08 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
JavaScript中的this机制
2016/01/30 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
Python3读取zip文件信息的方法
2015/05/22 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
python中的tcp示例详解
2018/12/09 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
在Python中实现字典反转案例
2020/12/05 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
英文版网络工程师求职信
2013/10/28 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
Ajax实现异步加载数据
2021/11/17 Javascript
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python