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

如何优化Tesseract对多语种多角度批量收据的OCR效果?

收据OCR识别优化方案

问题背景

需要处理一批收据/发票(包含扫描件与非扫描件),票据角度、质量差异大,涉及法语、英语、西班牙语三种语言。现有Python+pytesseract脚本仅能完美处理约30%的票据,存在两个核心问题:

  1. 部分票据(如法语收据)无法识别文本
  2. 鸟瞰视角转换脚本执行失败

现有代码已使用tessdata_best提升精度,尝试过unproject_text工具但无效果。


一、修复鸟瞰视角转换失败问题

1. 优化轮廓检测逻辑

  • 将轮廓检索模式从cv2.RETR_LIST改回cv2.RETR_EXTERNAL,优先获取票据的外部轮廓,避免内部干扰轮廓影响检测
  • 调整轮廓近似的epsilon值:将0.02 * peri改为0.03 * peri,适配边缘不够规整的票据,提升4点轮廓的检出率
  • 增加备选方案:若未找到4点轮廓,使用cv2.minAreaRect()获取票据的最小外接矩形,再提取四个角点完成透视转换,示例代码:
    if receiptCnt is None:
        # 尝试最小外接矩形
        if cnts:
            largest_cnt = cnts[0]
            rect = cv2.minAreaRect(largest_cnt)
            box = cv2.boxPoints(rect)
            receiptCnt = np.int0(box)
            transform_ok = True
    

2. 增加倾斜矫正容错

当透视转换失败时,先做基础倾斜矫正再进入OCR:

# 用Tesseract获取方向信息
osd = pytesseract.image_to_osd("receipt.jpeg")
angle = int(re.search('(?<=Rotate: )\d+', osd).group(0))
# 旋转图像矫正角度
if angle != 0:
    rotated = imutils.rotate_bound(orig_img, angle)
    rotated.save("receipt.jpeg")

3. 修正代码错误

现有代码中cv2.imwrite("receipt.jpeg", page)存在变量未定义问题,应改为cv2.imwrite("receipt.jpeg", receipt)。


二、提升多语言OCR识别精度

1. 修正语言参数

当前lang='script/Latin+fra+eng+spa'写法错误,Tesseract无需指定script/Latin,直接使用语言代码组合即可,按优先级排序:

raw_text = pytesseract.image_to_data(
    "receipt.jpeg",
    config=f"--tessdata-dir {tessdata_dir_best} --oem 1 --psm 6",
    lang='fra+eng+spa',  # 优先识别法语,再依次匹配英、西语
    output_type='dict'
)

2. 动态调整PSM模式

根据票据布局选择合适的PSM(页面分割模式):

  • 单栏规整票据:使用--psm 6(假设为单一连续文本块)
  • 多栏或稀疏文本:使用--psm 11(稀疏文本,自动检测文本块)
  • 若不确定布局,可先尝试--psm 3(自动分割,默认模式)

3. 强化LSTM引擎配置

确保--oem 1正确启用LSTM引擎,同时确认tessdata_best的版本与pytesseract依赖的Tesseract版本兼容,避免版本不匹配导致识别失效。


三、增强图像预处理流程

针对质量差异大的票据,分层处理:

1. 光照不均处理

使用自适应阈值替代简单灰度化,平衡局部光照:

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 自适应阈值二值化
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)

2. 降噪优化

结合多种降噪方法适配不同噪声类型:

  • 扫描件椒盐噪声:使用cv2.medianBlur(gray, 3)
  • 拍摄件模糊噪声:使用cv2.fastNlMeansDenoising(gray, None, 10, 7, 21)

3. 对比度增强

用CLAHE提升低对比度票据的文本清晰度:

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
enhanced_gray = clahe.apply(gray)

四、其他优化技巧

  • 分块识别:先检测票据中的文本小轮廓,过滤掉非文本区域,对每个文本块单独执行OCR,提升局部识别精度
  • 分类处理:针对扫描件和手机拍摄件,分别设计预处理流程(如扫描件侧重降噪,拍摄件侧重角度矫正与对比度增强)
  • 日志记录:记录转换失败、识别率低的票据路径与参数,针对性调整对应票据的处理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:10:37