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

使用Tesseract+CV2提取图像数字识别率低,求优化解决方案

可行解决思路

1. 修正预处理逻辑

你现有的预处理存在两处明显错误:

  • 卷积核拼写错误(karnel应为kernel),且1×1的卷积核对形态学处理无实际作用,建议改用2×2~3×3的卷积核
  • 阈值处理参数设置不合理,可先做高斯模糊去除噪点,再做二值化
    示例预处理代码:
import cv2
import numpy as np
import pytesseract

# 读取图像
image = cv2.imread('image.png')
# 放大2倍,适配tesseract对字号的要求
image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# 转灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 高斯模糊去噪
gray = cv2.GaussianBlur(gray, (3,3), 0)
# 二值化,因为数字是白色背景深色,所以用THRESH_BINARY_INV反转后得到黑底白字
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# 形态学处理,修复数字断裂
kernel = np.ones((2,2), np.uint8)
processed = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)

2. 优化ROI裁剪逻辑

固定坐标裁剪对位置偏移的兼容性极差,建议通过颜色过滤定位数字区域:

  • 你要识别的数字为亮白色,可通过阈值过滤直接提取所有白色连通域
  • 计算每个连通域的外接矩形,按坐标排序后即可得到各个待识别区域,无需手动写死坐标范围

3. 修正tesseract调用逻辑

你现有代码存在变量名错误:统计值识别时传入的ally_stats_grass并未定义,应该是你裁剪得到的stats1变量。
同时调整识别参数:

  • 纯单行数字识别使用--psm 7(假设为单行文本)比--psm 13识别准确率更高
  • 可额外添加-c page_separator=''避免输出多余空行
    示例识别代码:
# 识别名称区域
name_str = pytesseract.image_to_string(name_roi, lang='eng', config='--psm 6 --oem 3')
# 识别纯数字区域
stats_config = '--psm 7 --oem 3 -c tessedit_char_whitelist=0123456789.%'
stats1_str = pytesseract.image_to_string(stats1_roi, lang='eng', config=stats_config).strip()
# 转数字时做异常捕获
try:
    stats1_num = float(stats1_str.replace('%','')) if '%' in stats1_str else int(stats1_str)
except:
    # 识别失败可做重试或者标记
    stats1_num = None

4. 额外优化方案

如果上述调整后准确率仍不满足需求,可尝试训练tesseract的自定义字库:你要识别的字体是固定的游戏字体,只需采集几十张不同数字的样本训练专属字库,识别准确率可以提升到99%以上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:00:05