求助:使用pytesseract提取图像字符失败,仅能识别最多2个字符
解决小尺寸验证码OCR提取问题
针对你遇到的小尺寸字符OCR识别不准的问题,核心原因是原图像未做预处理,字符尺寸过小且对比度不足,导致Tesseract无法准确识别。以下是优化后的解决方案:
关键优化点
- 增加图像预处理:转为灰度图并二值化,强化字符与背景的对比度
- 放大字符尺寸:小尺寸字符是Tesseract识别的短板,放大后能显著提升准确率
- 微调Tesseract配置:保持单字符识别模式,同时确保字符白名单覆盖目标范围
优化后代码
import cv2 import pytesseract # 读取图像 image = cv2.imread('./images/screenshot_2023_11_16_15_41_24.png') # 图像预处理:转灰度→二值化→放大 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化(自适应阈值,适配不同光照) _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 放大字符(放大4倍,用INTER_CUBIC保证清晰度) scaled_char = cv2.resize(thresh, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC) # 分割字符(原图像36x9,4个字符各占9像素宽度) char_width = scaled_char.shape[1] // 4 char_height = scaled_char.shape[0] characters = [] for i in range(4): start = i * char_width end = (i + 1) * char_width char = scaled_char[0:char_height, start:end] characters.append(char) # 执行OCR识别 extracted_text = "" for char in characters: # 保持单字符识别模式,配置白名单 char_text = pytesseract.image_to_string( char, config='--psm 10 --oem 3 -c char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ) extracted_text += char_text.strip() print("Extracted Text:", extracted_text)
代码说明
- 预处理步骤:二值化反转后,字符变为白色、背景为黑色,完全符合Tesseract的识别偏好;放大操作让小字符的细节更清晰,避免Tesseract误判。
- 字符分割:基于放大后的图像重新计算分割位置,保证每个字符区域准确。
- OCR配置:
--psm 10指定单字符识别模式,配合白名单过滤无关字符,进一步提升识别精度。
运行上述代码后,即可准确提取出目标字符H9FA。
内容的提问来源于stack exchange,提问作者dbarrios
相关产品推荐
相关产品推荐

