Pytesseract tessedit_char_whitelist白名单设置无效,识别结果仍包含非数字字符
问题诱发原因
- Tesseract版本兼容性缺陷:4.x及以上版本的LSTM识别引擎(你参数中
--oem 3代表同时启用传统引擎+LSTM引擎)对白名单规则的支持度不足,LSTM引擎会优先输出训练集匹配结果,部分场景下会忽略白名单限制。 - 图片预处理不合格:如果待识别图片存在噪点、模糊、字符形变、背景干扰等问题,Tesseract会将视觉特征接近数字的字母误判输出,识别置信度过低时白名单规则也会失效。
- 参数配置冲突:你使用的
--psm 3为全自动页面分割模式,若图片中存在大块非数字区域,Tesseract的分割逻辑出错后也会跳过白名单限制输出其他字符。
对应解决办法
- 替换OCR引擎配置:将
--oem 3改为--oem 0仅启用传统识别引擎,传统引擎对白名单规则的支持更严格,同时将--psm 3改为--psm 6(假设你的图片为单块文本区域,若为单行数字可改用--psm 7)降低分割错误概率,修改后代码如下:
nums = pytesseract.image_to_string(img, config='--psm 6 --oem 0 -c tessedit_char_whitelist=0123456789')
- 若必须使用LSTM引擎,先将Tesseract升级到5.x以上版本,该版本修复了LSTM引擎对白名单支持的bug,同时在配置中添加
-c load_system_dawg=0 -c load_freq_dawg=0关闭词库匹配,避免词库优先级高于白名单:
nums = pytesseract.image_to_string(img, config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789 -c load_system_dawg=0 -c load_freq_dawg=0')
- 新增图片预处理步骤:识别前先对图片做灰度化、二值化、去噪处理,提升识别准确率,示例代码如下:
import cv2 # 灰度化处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 去噪处理 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) clean_img = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) # 传入预处理后的图片识别 nums = pytesseract.image_to_string(clean_img, config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789 -c load_system_dawg=0 -c load_freq_dawg=0')
- 增加后置校验兜底:识别完成后用正则过滤所有非数字字符,彻底清除错误输出:
import re nums = re.sub(r'[^0-9]', '', nums)
内容的提问来源于stack exchange,提问作者Nelson Oliva
相关产品推荐
相关产品推荐

