如何用脚本批量识别图片文字?从零搭建高效OCR工作流
目录导读
- 为什么需要批量OCR? —— 痛点场景与效率对比
- 核心工具选型 —— Python、Tesseract、PaddleOCR 谁更适合你?
- 环境搭建与脚本实战 —— 三行代码实现批量识别
- 进阶技巧 —— 图像预处理、多格式输出、错误处理
- 常见问题FAQ —— 不识别的字、多语言、大文件怎么办?
为什么需要批量OCR?一个真实场景
痛点案例:一家出版社需要将500页旧纸质书扫描为PDF后,提取其中文字进行数字化校对,如果手动逐页截图→用微信/QQ识别→复制粘贴,每页耗时2分钟,500页需要16.7小时,而用脚本批量识别,同样任务仅需30分钟,且准确率达95%以上。

效率对比: | 方式 | 单页耗时 | 500页耗时 | 错误率 | |------|---------|-----------|--------| | 手动截图+OCR | 2分钟 | 16.7小时 | 约5% | | 脚本批量识别 | 0.06分钟 | 30分钟 | 约3% |
工具选型:三大主流方案解析
Tesseract OCR(开源经典)
- 优势:支持100+语言、离线运行、社区文档丰富
- 缺点:识别精度对图像质量敏感,中文字符集需额外下载
- 适用场景:英文文档、印刷体中文、低资源环境
PaddleOCR(百度飞桨)
- 优势:自带中英文模型、识别精度高(尤其对印刷体+手写体混合)、自带版面分析
- 缺点:部署依赖PaddlePaddle框架(约1.2GB)
- 适用场景:中文文档、复杂排版、需要表格识别的场景
EasyOCR(轻量级)
- 优势:安装简单(纯Python)、支持80+语言、快速上手
- 缺点:对模糊图片效果差,CPU模式较慢
- 适用场景:小批量快速验证、多语言混合文档
推荐组合:
- 新手入门 → PaddleOCR(准确率优先)
- 系统集成 → Tesseract + 预处理优化(性能优先)
- 多语言需求 → EasyOCR(避免额外模型下载)
实战脚本:用PaddleOCR批量识别图片文字
环境安装(Windows/Mac/Linux通用)
pip install paddlepaddle paddleocr Pillow # 注意:GPU用户请安装 paddlepaddle-gpu
核心脚本(保存为 batch_ocr.py)
import os
from paddleocr import PaddleOCR
from PIL import Image
# 初始化OCR(使用中英文模型,首次运行自动下载)
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
# 设置图片文件夹路径
input_folder = "./images" # 存放图片的文件夹
output_file = "./results.txt" # 结果输出文件
def batch_ocr(folder, output_txt):
with open(output_txt, 'w', encoding='utf-8') as f:
for i, filename in enumerate(os.listdir(folder)):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):
img_path = os.path.join(folder, filename)
try:
result = ocr.ocr(img_path, cls=True)
text = ""
for line in result:
for word_info in line:
text += word_info[1][0] + " "
f.write(f"=== {filename} ===\n{text.strip()}\n\n")
print(f"[{i+1}] {filename} 识别完成")
except Exception as e:
f.write(f"=== {filename} ===\n【错误】{str(e)}\n\n")
print(f"[{i+1}] {filename} 识别失败: {e}")
if __name__ == "__main__":
batch_ocr(input_folder, output_file)
print("全部完成!结果已保存至:", output_file)
运行方法:将图片放入 ./images 文件夹,终端执行 python batch_ocr.py
进阶技巧:让识别结果更精准
图像预处理(提升OCR准确率30%)
在识别前对图片进行二值化、去噪、旋转校正:
from PIL import Image, ImageEnhance, ImageFilter
def preprocess_image(img_path):
img = Image.open(img_path).convert('L') # 转为灰度
# 调整对比度
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(2.0)
# 降噪
img = img.filter(ImageFilter.MedianFilter())
# 阈值二值化
threshold = 150
img = img.point(lambda x: 0 if x < threshold else 255)
return img
多格式输出(支持TXT/JSON/CSV)
修改脚本中的写入逻辑,例如输出为JSON方便后续处理:
import json
results = []
results.append({"filename": filename, "text": text.strip()})
json.dump(results, open("results.json", "w", encoding="utf-8"), ensure_ascii=False)
处理超大图片(3000万像素以上)
拆分图片为小块识别后合并,避免内存溢出:
def split_image(img_path, block=512):
img = cv2.imread(img_path)
h, w = img.shape[:2]
for y in range(0, h, block):
for x in range(0, w, block):
crop = img[y:min(y+block, h), x:min(x+block, w)]
# 识别 crop 并记录坐标
常见问题FAQ
Q1:识别结果出现乱码/毫无意义的符号怎么办?
A:通常是由于图片分辨率过低,请确保图片DPI≥300,字体大小≥12pt,若为手写体,建议改用PaddleOCR内置的lang='ch'模型。
Q2:如何识别英文+中文混合文档?
A:在初始化时指定多语言:PaddleOCR(lang='ch', use_space_char=True),系统会自动识别中日韩/英文混排。
Q3:脚本识别速度太慢,能加速吗?
A:可以尝试:
- 使用GPU版本(需安装CUDA)
- 降低
use_angle_cls为False(跳过文字方向检测) - 限制图像最大分辨率:
preprocess_image中缩放到1920px宽
Q4:图片中有表格,如何提取结构化数据?
A:使用PaddleOCR的表格识别模块:
from paddleocr import PPStructure engine = PPStructure(show_log=False) result = engine(img_path) # 结果包含表格的HTML结构
Q5:脚本报错 ImportError: No module named 'paddle'
A:确认已安装PaddlePaddle,若使用Mac M1芯片,请安装:pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
通过本文提供的脚本与优化技巧,你可以将“批量识别图片文字”这一重复性工作完全自动化,对于日均处理量超过1000张图片的场景,建议配合多线程处理(Python的 ThreadPoolExecutor),速度可再提升3-5倍。90%的识别问题可以通过高质量的预处理解决,当遇到极端复杂图片时,不妨先尝试图像增强工具(如ImageMagick)再喂给OCR引擎。
把你的图片文件夹准备好,打开终端,让脚本替你“阅读”它们吧。