Python使用pytesseract提取黑底白字识别准确率低如何解决
pytesseract黑底白字数字识别准确率优化方案
先修复现有代码的显性错误
现有代码存在3个直接影响识别结果的低级问题,优先修复:
cv2.imread()仅支持传入文件路径字符串,代码中传入已转换的numpy数组属于无效冗余代码,直接删除即可- 字符白名单配置中等号后多余的空格会导致规则不生效,这是数字0被误识别为
@/a/e的核心原因之一,白名单参数不要加多余空格 - Tesseract官方训练集全部基于白底黑字样本训练,直接传入黑底白字图像会大幅降低识别准确率,必须做反色处理
预处理流程优化
替换原有预处理逻辑,适配工业数字/黑底白字场景:
- 滤波保留字符边缘的前提下去掉背景噪点
- 转灰度后做反色操作,转换为Tesseract适配的白底黑字格式
- 用OTSU自动阈值替代手动写死的240阈值,避免画面亮度不均导致的字符残缺
- 增加小核形态学操作,去除画面细碎亮斑噪点
Tesseract参数调优
- PSM模式从4改为11(稀疏文本模式),适配图中分散排布的多段文本
- 白名单补全需要识别的大写英文字符(图中存在NIT、LUX等前缀),严格限制识别范围减少误判
- 保持OEM 3模式(默认+LSTM神经网络识别)即可
修正后可直接运行的代码
import numpy as np import cv2 import pytesseract from PIL import Image def preprocess(im): # 双边滤波去噪,不破坏字符边缘 im = cv2.bilateralFilter(im, 5, 55, 60) # 转灰度图 im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # 反色:黑底白字转白底黑字,适配Tesseract训练集 im = cv2.bitwise_not(im) # OTSU自动计算最优二值化阈值 _, im = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 2x2核做开运算,去除细碎背景噪点 kernel = np.ones((2,2), np.uint8) im = cv2.morphologyEx(im, cv2.MORPH_OPEN, kernel) return im # 修正读图逻辑 img = Image.open("Image.png") img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGBA2BGR) processed_im = preprocess(img_cv) # 修正配置参数,去掉多余空格,调整PSM模式,补全白名单字符 custom_config = r"--oem 3 --psm 11 -c tessedit_char_whitelist='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ. '" text = pytesseract.image_to_string(processed_im, lang='eng', config=custom_config) print(text.strip())
进阶优化方向
如果上述调整后仍有个别识别误差,可尝试以下方案:
- 替换默认英文训练集,使用工业数字/数码管专用Tesseract训练集,对这类规整数字字体的识别准确率远高于通用训练集
- 若图像中各文本块位置固定,可按坐标裁剪出每个单独的数值区域分别识别,避免不同区域字符互相干扰
- 若原图像字符尺寸过小,可使用双线性插值将图像放大2-3倍,让字符高度保持在30-40像素区间,符合Tesseract的最优识别尺寸要求
内容的提问来源于stack exchange,提问作者thethe
相关产品推荐
相关产品推荐

