一、前言:为什么选择 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 安装
bash
brew install tesseract
3. Linux / Ubuntu
bash
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
安装中文语言包(可选):
bash
sudo apt install tesseract-ocr-chi-sim
4. Python 安装 PyTesseract
bash
pip install pytesseract
pip install opencv-python
pip install pillow
三、PyTesseract 基础使用
OCR 两个核心步骤:
- 加载图像
- 调用 Tesseract 识别
最简单示例:
python
import pytesseract
from PIL import Image
img = Image.open("test.png")
text = pytesseract.image_to_string(img, lang="chi_sim")
print(text)
如果是 Windows,需要指定 tesseract 路径:
python
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 | 全自动页面分析 |
示例:
python
text = pytesseract.image_to_string(img, config='--psm 6')
2. OEM(引擎模式)
| 值 | 模式 |
|---|---|
| 3 | 默认模式(最佳) |
| 1 | LSTM 神经网络模式 |
3. 综合配置
python
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:读图与灰度化
python
import cv2
img = cv2.imread("test.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
步骤 2:二值化(推荐 OTSU)
python
import cv2
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
步骤 3:中值滤波去噪
python
denoise = cv2.medianBlur(thresh, 3)
步骤 4:OCR
python
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 项目也能用)
📌 完整项目代码(可直接运行)
python
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. 指定字符白名单 / 黑名单
python
config = "-c tessedit_char_whitelist=0123456789 --psm 7"
适用于:
- 仪表盘读数
- 数字金额
- 设备屏显
2. 识别表格
python
config = "--psm 11"
Tesseract 会识别稀疏文本,非常适合票据、账单。
3. 自动分割文本区域(ROI)
OCR 最佳实践:
不要整张图识别,应只识别特定区域(ROI)
例如检测"金额"位置的区域后再 OCR,准确率高 30%+。
4. 多语言识别
python
lang = "eng+chi_sim+num"
九、PyTesseract 的局限与替代方案
PyTesseract 属于经典 OCR,适合简单的:
- 票据
- 扫描件
- 批量 PDF
- 简单文本图像
- 数字仪表盘
但不适合:
- 弯曲文字
- 手写文字
- 复杂背景
- 噪声极多的图像
- 表格结构化识别
- 深度学习场景
这些可以用:
- PaddleOCR
- EasyOCR
- TrOCR(Deep Learning)
但 Tesseract 的优势永远是:
轻量、高速、跨平台、无依赖、可离线部署
十、总结:PyTesseract 的位置与价值
PyTesseract 是一个 超稳定、跨平台、免费、离线可用的 OCR 方案 。
它最大的价值是:
- 快速验证 OCR 方案
- 适合中小型离线项目
- 在仪表读数、票据 OCR、表单数字识别中仍大量使用
- 与 OpenCV 组合后可以做到极强的精度