查看: 376|回复: 3

Python实现图片文字OCR识别的两种方案详细对比与实战教程

[复制链接]
发表于 昨天 12:00 | 显示全部楼层 |阅读模式
在日常办公自动化中,图片文字提取(OCR)是高频需求,例如扫描件转文字、截图识别、发票信息提取等。Python 生态中有两个主流 OCR 库:PaddleOCR 和 Tesseract。本文从安装、配置到实战代码,完整对比两者的优缺点,并给出一个发票信息提取的实例。

### 方案概览

| 对比维度       | PaddleOCR                  | Tesseract                |
|----------------|----------------------------|--------------------------|
| 中文识别能力   | 优秀(95%+)               | 一般(80%–90%)          |
| 安装难度       | 中等(需安装 PaddlePaddle)| 简单(pip + 系统引擎)   |
| 识别速度       | 快                         | 较快                     |
| 版面分析       | 支持                       | 不支持                   |

如果主要处理中文场景,推荐优先使用 PaddleOCR;英文场景二者均可,但 Tesseract 配置更轻量。

### PaddleOCR 使用详解

PaddleOCR 是百度基于 PaddlePaddle 框架开发的 OCR 工具,内置了文本检测、方向分类和识别模型。安装时需同时安装底层框架和 OCR 包:
  1. pip install paddlepaddle paddleocr
复制代码

加载模型并指定参数:
  1. from paddleocr import PaddleOCR
  2. ocr = PaddleOCR(use_angle_cls=True, lang='ch')
复制代码

参数说明:
- use_angle_cls:是否开启文本方向分类(针对旋转图片,可提升识别准确率)。
- lang:语言,'ch' 表示中文简体(自动包含英文与数字)。

识别图片并输出结果:
  1. result = ocr.ocr('invoice.jpg')
  2. for line in result[0]:
  3.     text = line[1][0]
  4.     confidence = line[1][1]
  5.     print(f'{text} (置信度: {confidence:.2%})')
复制代码

返回的 result 是一个列表,每个元素代表一行识别结果,包含文本框坐标、识别文本和置信度。通过 line[1] 获取文本和置信度。

### Tesseract 使用详解

Tesseract 是 Google 维护的开源 OCR 引擎,Python 通过 pytesseract 调用。需要先安装 Tesseract 系统引擎(Windows 下载安装包,Linux 用 apt 等)。安装完成后通过 pip 安装 Python 绑定:
  1. pip install pytesseract
复制代码

同时需要安装语言包(例如中文简体 chi_sim)。代码示例如下:
  1. import pytesseract
  2. from PIL import Image
  3. text = pytesseract.image_to_string(
  4.     Image.open('text.png'),
  5.     lang='chi_sim+eng'
  6. )
  7. print(text)
复制代码

参数说明:
- lang:指定语言,多个语言用加号连接。
- 注意 pytesseract 默认会从系统路径查找 tesseract 可执行文件,若无法找到需手动配置 tesseract_cmd 路径。

### 实战:发票信息提取

下面以 PaddleOCR 为例,演示如何从发票图片中提取关键字段(发票号码和价税合计)。
  1. from paddleocr import PaddleOCR
  2. import re
  3. ocr = PaddleOCR(use_angle_cls=True, lang='ch')
  4. result = ocr.ocr('invoice.jpg')
  5. # 合并所有识别文本
  6. texts = [line[1][0] for line in result[0]]
  7. full_text = ''.join(texts)
  8. # 正则提取
  9. invoice_no = re.search(r'发票号码[::](\d+)', full_text)
  10. total = re.search(r'价税合计[::]?¥?([\d,]+\.\d{2})', full_text)
  11. print(f'发票号码: {invoice_no.group(1) if invoice_no else "未识别"}')
  12. print(f'价税合计: {total.group(0) if total else "未识别"}')
复制代码

代码逻辑:
- 利用 PaddleOCR 获取全部文字行。
- 拼接整段文本便于正则匹配。
- 使用 re.search 查找“发票号码:”后的数字串,以及“价税合计:”后的金额。
- 注意中文冒号和英文冒号都需考虑,金额可能带千分位逗号。

该方法直接用于自动化发票归档或财务数据录入,准确率取决于发票图片质量和 OCR 模型本身。

### 总结

- 中文场景优先选择 PaddleOCR:识别准确率高、支持版面分析、易用性好。
- 英文或轻量场景可选择 Tesseract:安装简单,适合纯文本识别。
- 实际项目可根据需求混合使用:先用 Tesseract 做快速尝试,若精度不足再切换 PaddleOCR。

开发者应根据任务的语言类型、对版面分析的需求以及部署环境(是否有 GPU)来决定选用哪个库。两个库均提供了成熟的 Python API,可快速集成到自动化脚本中。
回复

使用道具 举报

发表于 昨天 12:05 | 显示全部楼层

Re: Python实现图片文字OCR识别的两种方案详细对比与实战教程

感谢楼主分享这么详细的对比教程,正好最近在做一个发票识别的小工具,看完直接就能上手实测了。PaddleOCR 的中文识别率和正则提取的示例代码非常实用,尤其是考虑到中英文冒号差异和千分位逗号这一点,很周到。想请教一下:如果发票图片质量比较差(比如手机拍的有阴影),楼主是否有推荐的预处理步骤(比如二值化、去噪)能进一步提升识别率?再次感谢!
回复 支持 反对

使用道具 举报

发表于 昨天 12:05 | 显示全部楼层

Re: Python实现图片文字OCR识别的两种方案详细对比与实战教程

感谢楼主分享这么详细的对比和实战教程!之前一直用Tesseract做英文识别,中文确实不太理想,PaddleOCR的中文准确率看起来高很多,准备试试发票提取那个例子。想请教下,如果图片背景复杂或者有印章干扰,PaddleOCR的预处理有什么推荐方法吗?
回复 支持 反对

使用道具 举报

发表于 昨天 12:05 | 显示全部楼层

Re: Python实现图片文字OCR识别的两种方案详细对比与实战教程

感谢楼主的详细分享,对比清晰,代码也很实用。最近刚好在尝试用OCR做发票信息提取,PaddleOCR的中文识别率确实比Tesseract好不少,不过遇到一些背景复杂或字体较小的发票,偶尔会有漏识别的情况。想请教一下楼主,除了楼主提到的use_angle_cls参数,还有没有其他预处理技巧(比如二值化、降噪)能进一步提升PaddleOCR在复杂图片上的表现?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-17 04:03 , Processed in 0.033027 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部