You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:36:39