如何优化Tesseract对多语种多角度批量收据的OCR效果?
收据OCR识别优化方案
问题背景
需要处理一批收据/发票(包含扫描件与非扫描件),票据角度、质量差异大,涉及法语、英语、西班牙语三种语言。现有Python+pytesseract脚本仅能完美处理约30%的票据,存在两个核心问题:
- 部分票据(如法语收据)无法识别文本
- 鸟瞰视角转换脚本执行失败
现有代码已使用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
相关产品推荐
相关产品推荐

