如何优化pytesseract提升小尺寸屏幕截图数字识别准确率?
小尺寸数字区域OCR识别精度优化方案
问题描述
现有脚本用于截取屏幕上仅含数字的区域,当前配置能实现90%以上识别准确率,但因目标图像尺寸过小,仍存在数字识别错误(例如数字568识别出错),需优化配置提升精度。
原始图像

阈值处理后图像

错误示例(数字568识别错误)

现有代码
def text_from_region(region): """截取指定区域的数字文本并返回整数结果""" pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' img = ImageGrab.grab(bbox=(region)) img = np.array(img) img = cv2.cvtColor(src=img, code=cv2.COLOR_RGB2BGR) gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV) config = '--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789' text = pytesseract.image_to_string(thresh, config=config) return int(text)
精度提升优化方案
1. 图像放大预处理
小尺寸图像是识别错误的核心原因,先对图像进行插值放大,保留数字边缘细节:
# 在灰度化步骤后添加放大操作 gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY) # 用INTER_CUBIC插值放大2-4倍(根据实际尺寸调整) scale_factor = 3 gray = cv2.resize(gray, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_CUBIC)
2. 调整Tesseract核心参数
- 替换
--psm 10为--psm 8:PSM 8适配连续数字的词级识别(原PSM 10为单字符识别,不适用于多数字组合) - 切换LSTM引擎:使用
--oem 1替代--oem 3,LSTM对小字体、模糊字体的识别效果更优 - 添加置信度过滤:强制输出高置信度结果,减少误识别
优化后的配置:
config = '--psm 8 --oem 1 -c tessedit_char_whitelist=0123456789 -c min_char_confidence=80'
3. 图像后处理降噪
针对阈值处理后的图像,添加形态学操作消除微小噪点、优化数字边缘:
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV) # 定义小型结构元素,闭合数字边缘缝隙、消除噪点 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
4. 自定义字体训练(进阶方案)
如果上述优化仍有错误,可针对目标数字的字体制作专属训练样本,生成Tesseract自定义语言包,大幅提升特定字体的识别精度。
内容的提问来源于stack exchange,提问作者Collaxd
相关产品推荐
相关产品推荐

