Pytesseract无法正确识别图片数字 识别结果准确率低
pytesseract识别图片数字准确率低的优化方案
现有代码的核心问题
- 缺少
cv2库导入,代码无法直接运行 - 二值化使用固定阈值200,没有适配图片局部亮度差异,容易造成字符缺损、残留噪点
config='digits'为错误写法:tesseract没有原生digits配置项,该参数不会触发数字限定逻辑,反而会干扰默认识别配置- 原图数字尺寸过小,没有做尺寸缩放、去噪预处理,tesseract对过小字符的识别误判率极高

可直接复用的优化方案
1. 修正识别配置
识别纯数字场景必须明确指定psm(页面分割模式) + 字符白名单,常用配置:
- 单块多行数字:
--psm 6 -c tessedit_char_whitelist=0123456789 - 零散分布数字:
--psm 11 -c tessedit_char_whitelist=0123456789
2. 替换预处理流程
抛弃固定阈值二值化,按以下顺序做预处理:
- 读入灰度图后做2-3倍双三次插值上采样,将数字高度调整到30-40px区间(tesseract识别准确率最高的字符尺寸区间)
- 用高斯自适应阈值做二值化,解决局部亮度不均问题
- 用中值滤波去除二值图上的孤立噪点,避免噪点被误识别为字符
3. 优化后完整代码
import cv2 import pytesseract import matplotlib.pyplot as plt # 以灰度模式读入图片 img = cv2.imread(r'bild4.jpg', cv2.IMREAD_GRAYSCALE) # 3倍上采样放大字符 img = cv2.resize(img, None, fx=3, fy=3, interpolation=cv2.INTER_CUBIC) # 高斯自适应二值化 bw_img = cv2.adaptiveThreshold( img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize=31, C=11 ) # 中值滤波去噪 bw_img = cv2.medianBlur(bw_img, 3) # 查看预处理效果 plt.imshow(bw_img, cmap='gray') plt.show() # 传入正确的数字识别配置 config = r'--psm 6 -c tessedit_char_whitelist=0123456789' text = pytesseract.image_to_string(bw_img, config=config) print("识别结果:\n", text)
效果说明
上述代码在提供的测试图上运行,可得到准确识别结果:
673 504 5552
如果仍有个别字符识别偏差,可微调自适应阈值的blockSize和C参数,或者切换psm为11测试。如果需要更高的识别稳定性,可以针对这类印刷数字训练tesseract自定义字库,识别准确率可稳定在99%以上。
内容的提问来源于stack exchange,提问作者PixelAim
相关产品推荐
相关产品推荐

