使用OpenCV去除游戏图像背景以优化Tesseract OCR识别效果
游戏文字OCR识别优化方案
游戏文字识别效果差的核心问题是背景干扰,以下是针对性的背景去除+OCR优化流程,替换你现有处理逻辑:
1. 预处理:精准分离背景与文字
游戏界面背景通常有复杂纹理或渐变,普通阈值难以生效,改用HSV颜色空间+形态学操作提取文字:
import cv2 import numpy as np from tesserocr import PyTessBaseAPI, OEM # 读取图像并转换为HSV颜色空间(比BGR更易区分颜色) img = cv2.imread("ref.png") hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 根据文字实际颜色调整HSV范围(示例为白色文字) lower_text = np.array([0, 0, 200]) upper_text = np.array([180, 25, 255]) mask = cv2.inRange(hsv, lower_text, upper_text) # 提取文字区域,背景置黑 text_region = cv2.bitwise_and(img, img, mask=mask) # 转灰度图后二值化,确保文字为白色、背景为黑色 gray = cv2.cvtColor(text_region, cv2.COLOR_BGR2GRAY) _, binary_img = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY) # 去除噪点(游戏界面常见小颗粒干扰) kernel = np.ones((2,2), np.uint8) binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)
2. 优化Tesseract识别配置
针对游戏文字的固定字体、规整排版特性,调整识别参数:
with PyTessBaseAPI(psm=7, oem=OEM.LSTM_ONLY, path=f"ocr", lang="d2r") as api: # 限制识别字符集(仅保留游戏中可能出现的字符) api.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()") api.SetVariable("user_words_file", "ocr/dict.txt") api.ReadConfigFile("ocr/config.txt") api.SetImage(binary_img) print(api.GetUTF8Text().strip()) cv2.imshow('processed', binary_img) cv2.waitKey(0) cv2.destroyAllWindows()
关键调整要点
- 颜色范围校准:用取色工具获取目标文字的HSV值,调整
lower_text和upper_text(比如黄色文字范围约为[20,100,100]到[30,255,255]) - PSM模式选择:游戏文字多为单行或固定块,用
psm=7(单行识别)或psm=6(单一均匀块)比默认psm=3更精准 - 二值化方向:如果是深色背景配浅色文字用
THRESH_BINARY,反之用THRESH_BINARY_INV,确保文字为白色(Tesseract对白底黑字识别更稳定)
内容的提问来源于stack exchange,提问作者Bytelock
相关产品推荐
相关产品推荐

