Python中使用Tesseract识别截图数字的识别错误问题求助
Tesseract数字识别异常:1丢失或误判为4的问题
我编写了一个Python程序,用于识别截图中的数字并将其存入数组。程序整体运行正常,但偶尔出现识别错误:数字1要么无法被识别,要么被误判为4。例如数字100000被识别成00000。我尝试过调整不同的--oem和--psm参数,也使用过彩色截图和黑白截图进行识别,但问题始终存在。
程序代码
import cv2 import pytesseract import re import pyautogui import numpy as np pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def screen(): screen_for_array = pyautogui.screenshot() screen = np.array(screen_for_array) screen = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR) return screen def recognize_numbers(image, x, y, w, h): roi = image[y:y+h, x:x+w] gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) cv2.imshow('Image', gray) cv2.waitKey(0) cv2.destroyAllWindows() custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789' text = pytesseract.image_to_string(gray, config=custom_config) numbers = re.findall(r'\d+', text) return numbers image_path = screen() x, y, w, h = 333, 380, 90, 344 numbers = recognize_numbers(image_path, x, y, w, h) print("number recognition:", numbers)
识别结果
对应目标截图的识别结果为:
['95000', '97000', '98111', '98123', '99999', '00000', '110000', '120000', '125000', '149990']
该截图为程序识别所用的最终版本图像。
解决建议
- 强化图像预处理
- 增加二值化步骤:转灰度后通过阈值处理强化数字与背景的对比度,示例代码:
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 或用OTSU自动阈值 _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) - 降噪处理:用中值模糊或高斯模糊去除图像噪声,避免干扰识别:
blurred = cv2.medianBlur(gray, 3)
- 增加二值化步骤:转灰度后通过阈值处理强化数字与背景的对比度,示例代码:
- 调整Tesseract识别配置
- 尝试不同PSM模式:比如
--psm 7(单行文本识别),如果ROI内是多行数字,可逐行分割后用此模式;或--psm 10(单字符识别),配合逐字符区域识别。 - 优化字符配置:在白名单基础上,添加黑名单排除所有非数字字符,配置改为:
--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789 -c tessedit_char_blacklist=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+
- 尝试不同PSM模式:比如
- 分割多行数字单独识别
当前ROI包含多行数字,Tesseract可能因行间距或字体问题识别出错。可通过轮廓检测或固定行高将ROI分割为单行数字区域,逐行调用识别函数,提升准确率。 - 升级或训练自定义模型
- 升级Tesseract到最新版本,新版本对数字识别的算法有优化。
- 若场景字体特殊,可收集该字体的数字样本,训练Tesseract自定义字库,针对性优化识别效果。
内容的提问来源于stack exchange,提问作者Wlad
相关产品推荐
相关产品推荐

