Python实现图片文字OCR识别的两种方案详细对比与实战教程
在日常办公自动化中,图片文字提取(OCR)是高频需求,例如扫描件转文字、截图识别、发票信息提取等。Python 生态中有两个主流 OCR 库:PaddleOCR 和 Tesseract。本文从安装、配置到实战代码,完整对比两者的优缺点,并给出一个发票信息提取的实例。### 方案概览
| 对比维度 | PaddleOCR | Tesseract |
|----------------|----------------------------|--------------------------|
| 中文识别能力 | 优秀(95%+) | 一般(80%–90%) |
| 安装难度 | 中等(需安装 PaddlePaddle)| 简单(pip + 系统引擎) |
| 识别速度 | 快 | 较快 |
| 版面分析 | 支持 | 不支持 |
如果主要处理中文场景,推荐优先使用 PaddleOCR;英文场景二者均可,但 Tesseract 配置更轻量。
### PaddleOCR 使用详解
PaddleOCR 是百度基于 PaddlePaddle 框架开发的 OCR 工具,内置了文本检测、方向分类和识别模型。安装时需同时安装底层框架和 OCR 包:
pip install paddlepaddle paddleocr
加载模型并指定参数:
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
参数说明:
- use_angle_cls:是否开启文本方向分类(针对旋转图片,可提升识别准确率)。
- lang:语言,'ch' 表示中文简体(自动包含英文与数字)。
识别图片并输出结果:
result = ocr.ocr('invoice.jpg')
for line in result:
text = line
confidence = line
print(f'{text} (置信度: {confidence:.2%})')
返回的 result 是一个列表,每个元素代表一行识别结果,包含文本框坐标、识别文本和置信度。通过 line 获取文本和置信度。
### Tesseract 使用详解
Tesseract 是 Google 维护的开源 OCR 引擎,Python 通过 pytesseract 调用。需要先安装 Tesseract 系统引擎(Windows 下载安装包,Linux 用 apt 等)。安装完成后通过 pip 安装 Python 绑定:
pip install pytesseract
同时需要安装语言包(例如中文简体 chi_sim)。代码示例如下:
import pytesseract
from PIL import Image
text = pytesseract.image_to_string(
Image.open('text.png'),
lang='chi_sim+eng'
)
print(text)
参数说明:
- lang:指定语言,多个语言用加号连接。
- 注意 pytesseract 默认会从系统路径查找 tesseract 可执行文件,若无法找到需手动配置 tesseract_cmd 路径。
### 实战:发票信息提取
下面以 PaddleOCR 为例,演示如何从发票图片中提取关键字段(发票号码和价税合计)。
from paddleocr import PaddleOCR
import re
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
result = ocr.ocr('invoice.jpg')
# 合并所有识别文本
texts = for line in result]
full_text = ''.join(texts)
# 正则提取
invoice_no = re.search(r'发票号码[::](\d+)', full_text)
total = re.search(r'价税合计[::]?¥?([\d,]+\.\d{2})', full_text)
print(f'发票号码: {invoice_no.group(1) if invoice_no else "未识别"}')
print(f'价税合计: {total.group(0) if total else "未识别"}')
代码逻辑:
- 利用 PaddleOCR 获取全部文字行。
- 拼接整段文本便于正则匹配。
- 使用 re.search 查找“发票号码:”后的数字串,以及“价税合计:”后的金额。
- 注意中文冒号和英文冒号都需考虑,金额可能带千分位逗号。
该方法直接用于自动化发票归档或财务数据录入,准确率取决于发票图片质量和 OCR 模型本身。
### 总结
- 中文场景优先选择 PaddleOCR:识别准确率高、支持版面分析、易用性好。
- 英文或轻量场景可选择 Tesseract:安装简单,适合纯文本识别。
- 实际项目可根据需求混合使用:先用 Tesseract 做快速尝试,若精度不足再切换 PaddleOCR。
开发者应根据任务的语言类型、对版面分析的需求以及部署环境(是否有 GPU)来决定选用哪个库。两个库均提供了成熟的 Python API,可快速集成到自动化脚本中。
Re: Python实现图片文字OCR识别的两种方案详细对比与实战教程
感谢楼主分享这么详细的对比教程,正好最近在做一个发票识别的小工具,看完直接就能上手实测了。PaddleOCR 的中文识别率和正则提取的示例代码非常实用,尤其是考虑到中英文冒号差异和千分位逗号这一点,很周到。想请教一下:如果发票图片质量比较差(比如手机拍的有阴影),楼主是否有推荐的预处理步骤(比如二值化、去噪)能进一步提升识别率?再次感谢!Re: Python实现图片文字OCR识别的两种方案详细对比与实战教程
感谢楼主分享这么详细的对比和实战教程!之前一直用Tesseract做英文识别,中文确实不太理想,PaddleOCR的中文准确率看起来高很多,准备试试发票提取那个例子。想请教下,如果图片背景复杂或者有印章干扰,PaddleOCR的预处理有什么推荐方法吗?Re: Python实现图片文字OCR识别的两种方案详细对比与实战教程
感谢楼主的详细分享,对比清晰,代码也很实用。最近刚好在尝试用OCR做发票信息提取,PaddleOCR的中文识别率确实比Tesseract好不少,不过遇到一些背景复杂或字体较小的发票,偶尔会有漏识别的情况。想请教一下楼主,除了楼主提到的use_angle_cls参数,还有没有其他预处理技巧(比如二值化、降噪)能进一步提升PaddleOCR在复杂图片上的表现?
页:
[1]