前言
在 AI Agent、自动化办公、文档解析、截图分析场景,OCR 识图是高频底层能力。很多人混淆两个概念:OCR 光学字符识别(提取图片里面的文字) 和通用图像识图(理解图片里面画面内容、物体、场景)。 OCR 只负责把图像中的文字转成文本;而识图是更大的范畴,既包含 OCR 文字抽取,也包含图像分类、目标检测、图像问答。 本文讲清楚底层原理、Python 实现方案、各库对比、代码示例、性能边界,同时结合 Agent/MCP 场景讲实际落地坑点。
一、什么是 OCR
OCR 全称 Optical Character Recognition,光学字符识别。
输入:图片、截图、扫描 PDF、照片、照片里的票据、截图、手写纸张 输出:可编辑的文本字符串。
传统 OCR:灰度处理、二值化、字符分割、模板匹配。对印刷体尚可,倾斜、模糊、中文、复杂排版效果很差。
现代深度学习 OCR:
- 图像预处理:去噪、角度矫正、透视变换
- 文本检测:找到图片上哪些区域存在文字(文本框坐标)
- 文本识别:对每个框内图像识别出文字内容
- 后处理:排版还原、纠错、合并行。
重点区分:
- OCR:图片 → 文字
- 通用识图 / 图像 QA:图片 → 描述、物体标签、问答(大模型多模态识图)
Python 两者都可以实现,但是依赖完全不同的模型。
二、Python 能不能做 OCR / 识图?
完全可以,两条技术路线:
- 本地离线 OCR 库:PaddleOCR、Tesseract‑OCR,不需要调用云端 API,本地 CPU/GPU 运行,隐私数据不会外传。
- 多模态大模型识图:调用本地多模态模型或者 API,不止提取文字,还能看懂画面内容。
| 方案 | 能力 | 是否联网 | 适合场景 |
|---|---|---|---|
| Tesseract‑OCR | 印刷文字 OCR,中文弱 | 本地 | 简单英文图片,老项目 |
| PaddleOCR | 中文强、支持倾斜、表格、手写体 | 本地 CPU/GPU | 截图、票据、扫描件,Agent 本地 MCP 首选 |
| 多模态 API(GLM‑4V、DeepSeek‑VL) | OCR + 画面理解,识图问答 | 需要网络 | 复杂截图、图表分析,需要看懂图片含义 |
| 本地多模态 (Qwen‑VL) | OCR + 图像理解 | 本地 GPU | 完全私有化,硬件要求高 |
三、方案 1:Tesseract‑OCR(传统 OCR,不推荐中文场景)
环境安装
# windows需要先安装tesseract本体程序,apt/mac brew安装tesseract
pip install pytesseract pillow
简单示例代码
from PIL import Image
import pytesseract
img = Image.open("demo.png")
text = pytesseract.image_to_string(img, lang='eng')
print(text)
缺点:中文需要额外语言包,倾斜、背景复杂、截图识别效果差,现在新项目优先不选它。
四、方案 2:PaddleOCR,Python 离线中文 OCR 工业首选
PaddleOCR 是国内开源,针对中文深度优化,支持印刷体、手写、票据、截图、旋转图片,也是很多 MCP/Agent 内部 OCR 模块底层依赖。
安装
# cpu版本,绝大多数个人开发够用
pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install paddleocr
基础识别代码
from paddleocr import PaddleOCR
# use_angle_cls开启角度检测,lang='ch'中文
ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=False)
# 返回:文本框坐标,识别文字,置信度
result = ocr.ocr("screenshot.png", cls=True)
for page in result:
for line in page:
box = line[0]
txt, confidence = line[1]
print(f"文本:{txt},置信度:{confidence:.2f}")
提取纯拼接文本
def ocr_get_text(ocr_result):
texts = []
for page in ocr_result:
if page is None:
continue
for line in page:
texts.append(line[1][0])
return "\n".join(texts)
text_out = ocr_get_text(result)
print(text_out)
关键参数说明
use_angle_cls=True:自动矫正旋转 90/180 度图片,扫描件、手机拍照必开。use_gpu=True:有 N 卡 GPU 开启,速度大幅提升;无 GPU 关闭。lang="ch":中文;en英文。- 输出自带每个文字块的坐标,可以做表格还原、截图框选。
注意:第一次运行会自动下载模型权重。
五、OCR 不等于识图:Python 实现真正的图像理解(识图问答)
PaddleOCR只能拿文字,看不懂图表、看不懂画面含义 。 比如一张流程图、一张柱状截图,想让 Python 回答:这个图表趋势是什么?这就需要多模态大模型识图。
方式 A:调用多模态 API(开发简单,需要网络)
伪代码示例
# 传入图片二进制,请求VL大模型
# prompt:"详细描述这张截图,提取图表数据,分析内容"
# resp = api.image_qa(image_bytes, prompt)
# print(resp.content)
方式 B:本地部署 Qwen‑VL 等开源多模态模型(完全离线识图)
硬件门槛:最少 16G 显存,适合私有化 Agent 项目。 可以做到:图片 OCR 提取、图表解读、截图分析、问题问答。
工程选型总结:
- 只提取图片里的文字:直接上 PaddleOCR,轻量高效。
- 需要看懂图表、看懂画面逻辑:使用多模态视觉大模型。
六、常见坑点,生产环境必看
- 图片模糊、反光、强背景干扰:OCR 置信度暴跌,识别乱码。 预处理方案:灰度、二值化、裁剪、去噪。
- 大分辨率图片:直接送入模型很慢,建议做 resize 缩小。
- 表格图片:PaddleOCR 可以拿到单元格文字,但是不会自动合并表格结构;复杂表格建议用专门表格识别模型。
- 手写文字:潦草手写识别效果有限,只能识别工整手写。
- Agent/MCP 场景使用注意 很多人把 PaddleOCR 封装成 MCP 工具给智能体调用。 ⚠️ 不要直接把大段 OCR 原始文本全部塞进 LLM 上下文,需要做截断过滤,否则 Token 爆炸。
七、结合 Agent 的工程落地思路
- Agent 接收到图片文件;
- 调用 PaddleOCR MCP 工具,执行本地 OCR,拿到文本块 + 置信度;
- 过滤置信度过低的脏识别结果;
- 将精简后的文本交给大模型;
- 如果 OCR 信息不足以回答问题,再调用多模态 VL 模型做深度识图。
分层思路:优先轻量 OCR,不足再调用重的多模态模型,节省 token 和算力。
八、选型决策总结
- 简单英文印刷图片:Tesseract‑OCR,适合老旧项目。
- 中文截图、票据、扫描件,离线本地优先:PaddleOCR(首选)
- 需要看懂图表、画面、问答识图:多模态视觉模型(API/Qwen‑VL 等本地模型)。
OCR 是提取图片文字的利器,但它没有理解能力;识图是更大的集合,OCR 只是识图其中一个子模块。实际工程中经常两者组合使用。