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以并发方式编写高性能端口扫描器的方法
Jun 14 Python
python实现的多线程端口扫描功能示例
Jan 21 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
python 计算两个列表的相关系数的实现
Aug 29 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
pyecharts动态轨迹图的实现示例
Apr 17 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 Python
Python之基础函数案例详解
Aug 30 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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中的一个中文字符串截取函数
2007/02/14 PHP
php简单实现数组分页的方法
2016/04/30 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
PHP的自定义模板引擎
2017/03/24 PHP
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
python实现红包裂变算法
2016/02/16 Python
更新修改后的Python模块方法
2019/03/03 Python
tornado+celery的简单使用详解
2019/12/21 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
logging level级别介绍
2020/02/21 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
企业安全生产承诺书
2014/05/22 职场文书
志愿者活动总结报告
2014/06/27 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
浅谈Python 中的复数问题
2021/05/19 Python
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python