完整教程:Python PyTesseract OCR :从基础到项目实战


一、前言:为什么选择 PyTesseract?

在 OCR(Optical Character Recognition)领域,主流方案包括:

  • 商业类:Google Vision OCR、百度 OCR、阿里云 OCR、腾讯云 OCR
  • 自建类:PaddleOCR、EasyOCR、Tesseract OCR

其中 Tesseract OCR 是 Google 维护的开源文字识别引擎,免费、稳定、支持 100+ 种语言,广泛用于:

  • 票据文字抽取
  • 批量扫描 PDF 转文字
  • 水平、竖排文本识别
  • 简单车牌识别
  • 仪表盘读数
  • 快递单/发票预处理 OCR
  • 工业读码(非二维码类)

PyTesseract 是 Tesseract 的 Python 封装层,使 Python 程序员能更方便地调用 OCR。

本文章将从安装、基础使用、图像预处理、OCR 提升技巧、常用 API,到最终提供一个 真实可运行的 OCR 项目完整工程代码,让你从入门到能做项目。


二、环境安装(Windows / Linux / Mac)

PyTesseract 不是 OCR 引擎本体,它只是 Python 的 wrapper。
你必须安装 Tesseract-OCR 主程序


1. Windows 安装

下载安装包(官方推荐 UB Mannheim 版本):

https://github.com/UB-Mannheim/tesseract/wiki

安装后记住安装路径,例如:

C:\Program Files\Tesseract-OCR\tesseract.exe

2. macOS 安装

brew install tesseract

3. Linux / Ubuntu

sudo apt install tesseract-ocr
sudo apt install libtesseract-dev

安装中文语言包(可选):

sudo apt install tesseract-ocr-chi-sim

4. Python 安装 PyTesseract

pip install pytesseract
pip install opencv-python
pip install pillow

三、PyTesseract 基础使用

OCR 两个核心步骤:

  1. 加载图像
  2. 调用 Tesseract 识别

最简单示例:

import pytesseract
from PIL import Image
img = Image.open("test.png")
text = pytesseract.image_to_string(img, lang="chi_sim")
print(text)

如果是 Windows,需要指定 tesseract 路径:

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

四、OCR 效果差?图像预处理非常关键

实际商业项目中,原图直接 OCR 的效果往往很差
必须配合预处理:

常见操作:

预处理方法效果
灰度化去除颜色干扰
二值化增强对比
去噪减少 OCR 错误
膨胀 / 腐蚀处理断笔与黏连
自适应阈值适合光照不均
倾斜矫正文档拍歪解决
边缘增强提升模糊文本可读性

我们使用 OpenCV + PyTesseract 组合,效果远优于单独 OCR。


五、OCR 常用模式与配置

Tesseract 有两个关键参数:

1. PSM(Page Segmentation Mode)页面分割模式

常用:

模式
6单行文本(最常用)
7单一文本行
11稀疏文本(票据、表格)
3全自动页面分析

示例:

text = pytesseract.image_to_string(img, config='--psm 6')

2. OEM(引擎模式)

模式
3默认模式(最佳)
1LSTM 神经网络模式

3. 综合配置

config = "--oem 3 --psm 6 -c tessedit_char_blacklist=()"
text = pytesseract.image_to_string(img, config=config, lang="chi_sim")

六、强力 OCR 预处理工具:OpenCV 整合 PyTesseract(项目常用)

下面是 OCR 项目真正会用的预处理流程。


步骤 1:读图与灰度化

import cv2
img = cv2.imread("test.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

步骤 2:二值化(推荐 OTSU)

import cv2
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

步骤 3:中值滤波去噪

denoise = cv2.medianBlur(thresh, 3)

步骤 4:OCR

from PIL import Image
import pytesseract
text = pytesseract.image_to_string(Image.fromarray(denoise), lang="chi_sim", config="--psm 6")
print(text)

七、项目实战:识别一张票据 / 仪表文本(完整可运行代码)

下面给你一个企业级常用的 OCR 识别 pipeline,包括:

  • 图像自动裁剪
  • 去噪
  • 增强
  • 文字识别
  • 后处理(正则清洗)
  • 输出结构化数据

适合于:

  • 发票 / 小票
  • 仪表读数
  • 单据文字抽取
  • 工业检测数据记录
  • 设备状态监测(配合你 Jetson 项目也能用)

完整项目代码(可直接运行)

import cv2
import numpy as np
import pytesseract
from PIL import Image
import re
# Windows 用户需加上路径
# pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
# -------- 1. 读入图像 --------
img = cv2.imread("invoice.jpg")
# -------- 2. 灰度化 --------
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# -------- 3. 自适应阈值(二值化)--------
thresh = cv2.adaptiveThreshold(
gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
35, 11
)
# -------- 4. 形态学操作去噪 --------
kernel = np.ones((2, 2), np.uint8)
open_img = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
# -------- 5. 倾斜矫正(适合拍照的发票)--------
coords = np.column_stack(np.where(open_img > 0))
angle = cv2.minAreaRect(coords)[-1]
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
(h, w) = open_img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(open_img, M, (w, h), flags=cv2.INTER_CUBIC)
# -------- 6. OCR --------
config = "-l chi_sim --oem 3 --psm 6"
text = pytesseract.image_to_string(rotated, config=config)
# -------- 7. 文本后处理:使用正则抽取关键字段 --------
amount = re.findall(r"金额[:: ]?([\d\.]+)", text)
date = re.findall(r"日期[:: ]?(\d{4}-\d{2}-\d{2})", text)
print("识别文本:\n", text)
print("金额:", amount)
print("日期:", date)
# -------- 8. 保存中间结果,便于调试 --------
cv2.imwrite("gray.jpg", gray)
cv2.imwrite("thresh.jpg", thresh)
cv2.imwrite("rotated.jpg", rotated)

八、高级 OCR 技巧(工程级提升 OCR 准确率)

1. 指定字符白名单 / 黑名单

config = "-c tessedit_char_whitelist=0123456789 --psm 7"

适用于:

  • 仪表盘读数
  • 数字金额
  • 设备屏显

2. 识别表格

config = "--psm 11"

Tesseract 会识别稀疏文本,非常适合票据、账单。


3. 自动分割文本区域(ROI)

OCR 最佳实践:

不要整张图识别,应只识别特定区域(ROI)

例如检测“金额”位置的区域后再 OCR,准确率高 30%+。


4. 多语言识别

lang = "eng+chi_sim+num"

九、PyTesseract 的局限与替代方案

PyTesseract 属于经典 OCR,适合简单的:

  • 票据
  • 扫描件
  • 批量 PDF
  • 简单文本图像
  • 数字仪表盘

但不适合:

  • 弯曲文字
  • 手写文字
  • 复杂背景
  • 噪声极多的图像
  • 表格结构化识别
  • 深度学习场景

这些可以用:

  • PaddleOCR
  • EasyOCR
  • TrOCR(Deep Learning)

但 Tesseract 的优势永远是:

轻量、高速、跨平台、无依赖、可离线部署


十、总结:PyTesseract 的位置与价值

PyTesseract 是一个 超稳定、跨平台、免费、离线可用的 OCR 方案
它最大的价值是:

  • 快速验证 OCR 方案
  • 适合中小型离线项目
  • 在仪表读数、票据 OCR、表单数字识别中仍大量使用
  • 与 OpenCV 组合后可以做到极强的精度

posted @ 2025-12-16 21:16  clnchanpin  阅读(237)  评论(0)    收藏  举报