You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化PyTesseract对各类多格式文档图像的OCR识别准确率

PyTesseract 通用文档OCR识别优化方案

测试图像

  • 零售报表测试图
  • 英语试题测试图

现有代码问题修复

你当前提供的代码存在死循环漏洞:get_text_from_image函数末尾递归调用自身,会触发栈溢出导致程序崩溃,需要先删除这行递归代码。此外pre_process函数的文档字符串缩进错误,需要修正对齐。

DPI在OpenCV+Tesseract流程中的作用

Tesseract的训练数据集以300DPI的标准扫描文档为基准,低于该分辨率时字符边缘特征不足,识别准确率会明显下降。OpenCV处理的是像素矩阵本身,不读取图像内置的DPI元数据,你当前固定2倍缩放的逻辑本质是模拟提升DPI,但适配性很差,无法覆盖不同原始分辨率的输入。

通用场景优化方案

以下方案可兼容扫描版PDF、JPG、PNG等多种输入格式,无需针对单张图像手动调参:

  • 自适应预处理优化
    替换固定阈值二值化为自适应阈值,应对光照不均的场景:cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
    新增降噪步骤:用cv2.medianBlur(thresh, 3)去除椒盐噪点,避免干扰字符识别
    新增对比度增强:用CLAHE限幅自适应直方图均衡处理低对比度图像,比普通直方图均衡更适合文字场景
    动态计算缩放比例:先判断输入图像的平均字符高度,若小于30像素则按比例缩放到字符高度为30-40像素的区间,等效模拟300DPI效果,不要固定2倍缩放
  • Tesseract参数优化
    通用场景替换固定--psm 6为--psm 11(稀疏文本模式)或--psm 3(全自动分页模式),适配多列、混合排版的文档
    显式添加--dpi 300参数,告知Tesseract当前输入为300DPI标准,提升模型匹配精度
    可按需添加字符白名单,过滤无意义乱码:比如纯英文场景添加-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:()[]{}'"/+-
  • 多格式输入兼容
    扫描版PDF用pdf2image库转换时直接指定dpi=300,比后续用OpenCV缩放的画质损失更小
    输入图像先读取EXIF元数据中的DPI值,若低于200则自动按比例缩放至等效300DPI尺寸
  • 后处理修正
    用正则过滤识别结果中的无意义乱码字符,针对常见词汇可接入英文词典做模糊拼写修正,比如将识别错误的"Nevember"修正为"November"

优化后核心代码示例

import cv2
import pytesseract as tess
import numpy as np

def pre_process(img):
    """Apply preprocessing to an image"""
    # 倾斜校正
    angle = getSkewAngle(img)
    img = rotateImage(img, -1.0 * angle)
    # 动态缩放:可结合EXIF读取的原始DPI计算缩放比例,此处为示例值
    scale = 3
    img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC)
    # 转灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # CLAHE对比度增强
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    gray = clahe.apply(gray)
    # 自适应阈值二值化
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                                  cv2.THRESH_BINARY_INV, 11, 2)
    # 中值滤波去噪
    thresh = cv2.medianBlur(thresh, 3)
    return thresh

def get_text_from_image(path):
    """Retrieve text data from image"""
    img = cv2.imread(path)
    if img is None:
        return ""
    img = pre_process(img)
    # 优化后的Tesseract参数
    text = tess.image_to_string(
        img, lang='eng', 
        config='--psm 11 --oem 3 --dpi 300'
    ) 
    return text

内容的提问来源于stack exchange,提问作者Dalireeza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 13:12:04