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

使用pytesseract识别固定位置同字体数字时部分无输出求助

问题根因
  • 未指定识别范围与分割模式:pytesseract默认按全字符集、整页文档逻辑识别,你的场景是固定位置的短数字串,默认配置下会把大量有效数字判定为非文本内容,直接返回空值。
  • 图像尺寸不匹配识别要求:tesseract对文字像素尺寸有要求,单字符高度建议在20-30像素以上,你截图裁剪后的数字如果尺寸过小,会触发识别失败。
  • 裁剪区域留白不足:tesseract识别需要字符周围有少量留白,如果你裁剪的区域刚好贴住数字边缘,会被判定为无效图像。
  • 二值化后字符易断裂:部分截图二值化后数字可能出现轻微断裂,也会影响识别结果。
优化实现方案

核心优化点

  1. 给pytesseract添加专属配置:指定页面分割模式为单行文本(PSM=7)、识别字符白名单仅保留数字,避免无效识别。
  2. 预处理环节补充尺寸放大、边界填充、形态学优化操作,适配tesseract的识别要求。
  3. 识别结果增加去空格、去换行处理,过滤无效输出。

优化后代码示例

import cv2
import numpy as np
import pytesseract

# 数字识别专属配置:OEM3用默认引擎,PSM7按单行文本识别,白名单仅允许数字
TESS_CONFIG = r'--oem 3 --psm 7 -c tessedit_char_whitelist=0123456789'

def checkNumbers(image):
    numbers = []
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    gray = cv2.bitwise_not(gray)
    gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

    for loc in storeLocations:
        cropped = gray[loc[1]:loc[1]+storeHeight, loc[0]:loc[0]+storeWidth]
        # 放大2倍适配识别尺寸
        cropped = cv2.resize(cropped, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
        # 添加2像素黑边填充,避免文字贴边
        cropped = cv2.copyMakeBorder(cropped, 2, 2, 2, 2, cv2.BORDER_CONSTANT, value=0)
        # 轻微膨胀修复字符断裂
        kernel = np.ones((2, 2), np.uint8)
        cropped = cv2.dilate(cropped, kernel, iterations=1)
        # 识别后去除空白字符
        number = pytesseract.image_to_string(cropped, config=TESS_CONFIG).strip()
        numbers.append(number)
        print(number)

如果你的场景是单个数字识别,把配置中的--psm 7改为--psm 10(按单字符识别)即可,准确率会进一步提升。

内容的提问来源于stack exchange,提问作者Saksham Rustagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:06:04