使用OpenCV与PyTesseract识别文档数字准确率低的优化咨询
问题解答
识别率不足75%是否正常?
不正常。针对纯数字场景的OCR,经过合理的图像预处理和参数调整后,识别率应该能达到95%以上,甚至接近100%。当前的低识别率主要是因为图像预处理步骤没有有效消除噪声、增强数字特征,导致PyTesseract无法准确识别。
提升识别成功率的方法
1. 优化二值化策略
固定阈值二值化容易受光照和噪声影响,改用自适应二值化或Otsu自动阈值二值化,能更精准分离数字和背景:
- 自适应高斯二值化代码:
import cv2 import numpy as np img_raw = cv2.imread("temp.jpg") img_gray = cv2.cvtColor(img_raw, cv2.COLOR_BGR2GRAY) # 自适应阈值二值化,高斯加权计算局部阈值 img_thresh = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) - Otsu自动阈值二值化代码:
_, img_otsu = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
2. 形态学操作消除噪声
通过开运算去除数字周围的小噪声,闭运算填充数字内部的空隙,让数字边缘更规整:
# 创建3x3矩形结构元素 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 开运算:先腐蚀后膨胀,去除白色小噪声 img_cleaned = cv2.morphologyEx(img_thresh, cv2.MORPH_OPEN, kernel) # 闭运算:先膨胀后腐蚀,填充数字内部的黑色小空隙 img_cleaned = cv2.morphologyEx(img_cleaned, cv2.MORPH_CLOSE, kernel)
3. 配置PyTesseract专属识别参数
针对纯数字场景,限制识别字符范围、调整页面分割模式,减少干扰:
import pytesseract # 配置参数:oem3使用默认OCR引擎,psm6假设图像为单一文本块,whitelist只允许数字 custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789' # 对预处理后的图像进行识别 result = pytesseract.image_to_string(img_cleaned, config=custom_config)
如果数字是分散排列的,可将--psm 6改为--psm 11(允许识别任意位置的文本)。
4. 增强图像对比度
通过CLAHE(限制对比度自适应直方图均衡化)增强数字与背景的差异,避免过度增强噪声:
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) img_enhanced = clahe.apply(img_gray)
5. 优化PDF转图像的参数
当前600DPI的分辨率足够,可尝试保存为PNG无损格式替代JPG,避免压缩带来的额外噪声:
first_page[0].save(TEMP_FOLDER+'temp.png', 'PNG')
内容的提问来源于stack exchange,提问作者Romain Che
相关产品推荐
相关产品推荐

