使用pytesseract识别图片气泡字体数字无输出的问题咨询
问题描述
我尝试使用pytesseract识别仅包含1-10气泡字体数字的图片,提取其中的数字内容。
待识别的参考图片如下:
我参考了一篇介绍该实现流程的文章,文中称该实现非常简单,我写的对应代码如下:
lives = pyautogui.locateOnScreen('pics/lives.png', confidence = 0.9) ss = pyautogui.screenshot(region=(lives[0]+lives[2],lives[1],lives[2]-6,lives[3])) ss.save('pics/tempLives.png') img = cv2.imread('pics/tempLives.png') cv2.imwrite('pics/testPic.png',img) test = pytesseract.image_to_string(img) print(test)
我通过ss.save和cv2.imwrite导出校验过,代码中读取的img变量内容和上述待识别图片完全一致。
运行代码后无法打印输出任何识别结果,我猜测气泡字体会提升识别难度,但参考文章中可以轻松识别蓝色括号字符,理论上该字体的识别难度不应过高,求可行的解决思路。
解决思路
- 先排查环境问题:本地安装的tesseract如果版本过旧、缺失eng语言包,会直接返回空结果。先拿一张常规印刷体数字的截图跑基础识别逻辑,确认环境正常再调识别逻辑。
- 必须加图像预处理步骤:pytesseract默认只对高对比度、无装饰的常规印刷体识别效果好,气泡字体有轮廓装饰、和背景对比度不足时直接识别必然失败。预处理流程:
- 将读取的图片转灰度图
- 做二值化处理,调整阈值把白色气泡数字和背景彻底分离,必要时加反向二值化,tesseract原生对深字浅底的识别效果远好于浅字深底,要保证处理后的图是深色字、浅色背景
- 用形态学开/闭运算去掉字体边缘的杂色噪点,避免装饰轮廓干扰识别
预处理+识别的参考代码:
import cv2 import pytesseract img = cv2.imread('pics/tempLives.png') # 转灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化,阈值根据实际截图的颜色调整,THRESH_BINARY_INV用来反转颜色适配tesseract识别习惯 thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)[1] # 形态学运算去噪 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) clean_img = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) # 自定义识别配置:oem 3用默认引擎,psm 10适配单字符识别,限定只输出数字缩小匹配范围 ocr_config = r'--oem 3 --psm 10 -c tessedit_char_whitelist=0123456789' result = pytesseract.image_to_string(clean_img, config=ocr_config).strip() print(result)
- 调整OCR的页面分割模式(psm)参数:默认psm参数是自动全页分割,针对截图里的小区域单数字/短数字场景,要匹配对应模式:单数字识别用
--psm 10,单行连续数字用--psm 7,默认模式很容易漏判小尺寸的文本区域。同时通过tessedit_char_whitelist参数限定只识别0-9数字,大幅降低误判、空判概率。 - 如果预处理后识别率还是达不到要求,直接用模板匹配替代OCR:你需要识别的内容只有1-10共10种固定的气泡字体样式,提前截好每个数字的标准模板图,用
cv2.matchTemplate做模板匹配,置信度阈值设0.8以上即可,识别速度和准确率远高于tesseract,不会出现空识别的问题。
内容的提问来源于stack exchange,提问作者Mason Vick
相关产品推荐
相关产品推荐

