如何提升Pytesseract图文转换准确率?Steam游戏Python Bot优化
问题:Pytesseract识别游戏文本准确率极低(仅能识别单个字母)
我正在为Steam平台的游戏《Typing Incremental》开发一款Python机器人,流程是用pyautogui截取游戏文本显示区域的截图,通过pytesseract将截图转成字符串,最后用pyautogui完成输入。
现在遇到的问题是,pytesseract的图文转换准确率极低,只有单个字母(比如“A”)能被正确识别,其他内容都识别不对。
作为编程新手,我已经试过这些方法:给代码加延时、多次调整截图区域、添加可检测词汇白名单(不确定是否生效),但问题还是没解决。
附上我的代码:
import pytesseract import pyautogui import time import keyboard pytesseract.pytesseract.tesseract_cmd = "C:\\Program Files\\Tesseract-OCR//tesseract.exe" time.sleep(1) while True: if keyboard.is_pressed("`"): break image = pyautogui.screenshot(region=(285, 155, 1566, 210)) time.sleep(1) converted = pytesseract.image_to_string(image)
可行的解决方法
1. 对截图做图像预处理
游戏文本通常有特殊样式(发光、渐变、自定义字体),原始截图的对比度和噪声会干扰识别,先做预处理:
- 转灰度图:减少颜色干扰
- 阈值处理:强化文本与背景的对比度
- 去噪:过滤游戏特效带来的杂点
示例代码(需要安装PIL库):
from PIL import Image, ImageOps, ImageFilter # 截图后添加预处理步骤 image = pyautogui.screenshot(region=(285, 155, 1566, 210)) # 转灰度 gray_img = ImageOps.grayscale(image) # 阈值调整(可根据实际截图修改127的值,让文本完全变黑、背景变白) threshold_img = gray_img.point(lambda x: 0 if x < 127 else 255, '1') # 去除噪声 cleaned_img = threshold_img.filter(ImageFilter.MedianFilter()) # 用处理后的图像识别 converted = pytesseract.image_to_string(cleaned_img)
2. 调整Tesseract的识别模式
用--psm参数指定页面分割模式,针对游戏里的单字符/单词场景更精准:
--psm 10:强制识别单个字符--psm 8:识别单个无空格单词--psm 6:假设输入是单一均匀文本块
示例:
converted = pytesseract.image_to_string(cleaned_img, config='--psm 8')
3. 限定识别字符集
如果游戏文本只有英文字母,直接指定白名单减少干扰:
converted = pytesseract.image_to_string(cleaned_img, config='--psm 8 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
4. 确认截图区域准确性
调用image.show()查看截取的图像,确保区域只包含目标文本,没有多余的UI边框、特效元素——这些杂项会严重影响识别结果。
5. 训练自定义字体库(进阶)
如果游戏用了非常特殊的字体,官方Tesseract数据没有覆盖,可以提取游戏内的文本样本,训练自定义字库,这是提升准确率最彻底的方法。
内容的提问来源于stack exchange,提问作者Ollie H
相关产品推荐
相关产品推荐

