使用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
相关产品推荐
相关产品推荐

