如何用脚本批量识别图片文字?

wen 实用脚本 3

如何用脚本批量识别图片文字?从零搭建高效OCR工作流

目录导读

  1. 为什么需要批量OCR? —— 痛点场景与效率对比
  2. 核心工具选型 —— Python、Tesseract、PaddleOCR 谁更适合你?
  3. 环境搭建与脚本实战 —— 三行代码实现批量识别
  4. 进阶技巧 —— 图像预处理、多格式输出、错误处理
  5. 常见问题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:可以尝试:

  1. 使用GPU版本(需安装CUDA)
  2. 降低 use_angle_cls 为False(跳过文字方向检测)
  3. 限制图像最大分辨率: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引擎。

把你的图片文件夹准备好,打开终端,让脚本替你“阅读”它们吧。

抱歉,评论功能暂时关闭!