首页Python【Python计算生态】p...

【Python计算生态】pytesseract——基于Tesseract OCR引擎的图片文字识别库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





pytesseract 是一个Python库,它是Google 开发的开源OCR工具Tesseract OCR引擎的Python封装,提供了简单易用的接口,能够轻松实现图像中文字的识别,支持100多种语言,并且可轻松扩展语言包。
pytesseract通过结合OpenCVPIL,提供了丰富的图像处理功能,可以对图像进行预处理以提高 OCR 精度。
01
安装

  • 安装:
因为pytesseract 是基于Tesseract OCR引擎的,因此需要预先安装 Tesseract,在其官方GitHub页面可以找到适合你操作系统的安装方式,并将安装路径添加到系统环境变量中:
https://github.com/tesseract-ocr/tesseract
安装完Tesseract后,可以通过以下命令安装pytesseract
pip install pytesseract
需要注意的是,Pillow库也是pytesseract库的依赖项,也需要预先安装。
  • 语言包:
在使用前可以通过get_languages()函数获取Tesseract OCR当前支持的所有语言(即安装Tesseract时勾选的语言选项):
pytesseract.get_languages()

如果要识别更多语言,需要下载并安装相应的语言包:

  • 下载语言包:

TesseractGitHub页面下载需要的语言包。例如,如果需要中文简体的语言包,可以下载chi_sim.traineddata文件。
https://github.com/tesseract-ocr/tessdata
  • 安装语言包:

下载需要的语言包后,将.traineddata文件放置到Tesseract安装目录下的tessdata文件夹中。
02
使用

pytesseract库提供了多个函数来实现不同OCR功能,以下是一些主要的函数:

  • image_to_string()——从图像中提取文本:

image_to_string()函数是pytesseract库中最常用的函数之一,它用于将图像中的文本转换为字符串,其基本语法如下:

image_to_string(image, lang=None)

以下是该函数的一些主要参数:

  • image:必需参数,要进行字符识别的图像。可以是PIL Image对象、NumPy数组或者是图像文件的路径。如果传递的是对象而不是文件路径,pytesseract会隐式地将图像转换为RGB模式。
  • lang:可选参数,指定要使用的语言模型的语言标识符。这确定了Tesseract将使用哪种语言的字符识别模型。例如,‘eng’表示英语,‘chi_sim’表示中文简体等。默认情况下,它使用英语模型。可以根据需要设置多个语言,以提高识别准确性。

以下是一个简单的使用示例:

# 打开图像文件
image = Image.open('./data/test_1.jpg')

# 进行文字识别
# 如果需要识别特定语言,可以通过 lang 参数指定语言代码
text = pytesseract.image_to_string(image,lang='chi_sim')
print(text)

另外,可以传入包含多个图像文件路径列表的txt件进行批处理:

# 打开图像文件
image_txt = './data/images.txt'

# 进行文字识别
text = pytesseract.image_to_string(image_txt,lang='chi_sim')
print(text)


  • image_to_boxes()——返回包含识别字符及其边界框的结果:

image_to_boxes()函数将返回每个字符的边界框坐标。这些坐标通常以字符串的形式给出,每个字符的边界框由四个值组成:字符的左边界、上边界、宽度和高度。
例如,“实 168 1178 267 1256 0”,从左到右依次为:识别的字符文本、左下角的横坐标、左下角的纵坐标、右上角的横坐标、右上角的纵坐标。最后的0不确定具体含义。
以下是一个简单的使用示例:
# 打开图像文件
image = Image.open('./data/test_1.jpg')

# 进行文字识别
boxes = pytesseract.image_to_boxes(image,lang='chi_sim')
print(boxes)

  • image_to_data()——返回包含方格边界、confidences 和其他信息的结果。:

image_to_data()函数提供了更详细的输出,包括每个识别到的文字的坐标位置、置信度等信息,其基本语法如下:

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

以下是该函数的一些主要参数:

  • image:必需参数,要进行字符识别的图像。可以是PIL Image对象、NumPy数组或者是图像文件的路径。如果传递的是对象而不是文件路径,pytesseract会隐式地将图像转换为RGB模式。
  • lang:可选参数,指定要使用的语言模型的语言标识符。这确定了Tesseract将使用哪种语言的字符识别模型。例如,‘eng’表示英语,‘chi_sim’表示中文简体等。默认情况下,它使用英语模型。可以根据需要设置多个语言,以提高识别准确性。
  • config:可选参数,一个字符串,用于指定Tesseract的其他配置选项。你可以在这里设置各种Tesseract参数,如图像处理参数、OEMOCR引擎模式)参数等。例如,–psm 6表示使用页面分段模式6。配置选项可以根据你的需求进行自定义。
  • nice:可选参数,修改Tesseract运行的处理器优先级。该参数在Windows系统上不支持。它调整了类Unix系统进程的优先级。
  • output_type:可选参数,指定输出的数据类型。该参数支持以下几种选项:STRING(默认的输出类型,返回识别结果的字符串形式)、BYTES(返回识别结果的字节形式)、DICT(返回一个包含识别结果详细信息的字典,其中包含边界框、置信度等信息)、DATAFRAME(返回一个Pandas DataFrame对象,其中包含识别结果的详细信息),默认值是pytesseract.Output.STRING
  • timeout:可选参数,OCR处理的持续时间(以秒为单位),在此之后,pytesseract将终止并可能引发RuntimeError

以下是一个简单的使用示例:

# 打开图像文件
image = Image.open('./data/test_1.jpg')

# 进行文字识别
data = pytesseract.image_to_data(image,lang='chi_sim' , output_type=pytesseract.Output.DATAFRAME)
print(data)

返回结果为一个Pandas DataFrame对象,其中包含识别结果的详细信息:

03
图像预处理

如果原始图像中存在噪声或文字排版不规则的情况,会显著影响识别准确性。为了提升 OCR 的识别效果,通常需要对图像进行预处理,以消除噪声、增强文字对比度、规范化排版等。OpenCV 和 PIL(Pillow)是两种常用的图像处理库,它们提供了丰富的工具来进行图像预处理。

以下是一些使用 OpenCV 或 PIL 进行图像预处理以提升 OCR 准确性的常见方法:

  • 1. 灰度化:

将彩色图像转换为灰度图像可以简化处理过程,因为 OCR 通常只需要关注文字的形状和位置,而不需要颜色信息。

OpenCV:使用 cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

PIL:使用 image.convert(‘L’)

  • 2. 二值化:

将灰度图像转换为二值图像(仅包含黑白两种颜色),这有助于更好地分离文字和背景。

OpenCV:可以使用 cv2.threshold() 或自适应阈值方法 cv2.adaptiveThreshold()

PIL:使用 image.point(lambda x: 0 if x < threshold else 255, ‘1’)(需要手动设置阈值)。
    • 3. 噪声消除:

    使用滤波器(如高斯滤波器、中值滤波器等)来平滑图像,减少噪声。

    OpenCVcv2.GaussianBlur() 或 cv2.medianBlur()

    PIL:可以使用 ImageFilter 模块中的滤波器。

      以下是一个简单的使用示例:

      import cv2

      # 加载图像
      image = cv2.imread('./data/test_1.jpg')

      # 转为灰度图
      gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

      # 二值化
      _, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)

      # 保存处理后的图像并提取文本
      cv2.imwrite("./data/processed_image.jpg", binary)

      # 对预处理后的图像文件进行文本识别
      text = pytesseract.image_to_string(binary,lang='chi_sim')
      print(text)


      更多内容,可以前往官方GitHub页面查看:

      https://github.com/madmaze/pytesseract


      本篇文章来源于微信公众号: 码农设计师

      RELATED ARTICLES

      欢迎留下您的宝贵建议

      Please enter your comment!
      Please enter your name here

      - Advertisment -

      Most Popular

      Recent Comments