如何优化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
相关产品推荐
相关产品推荐



