如何用Python识别验证码图片文本?pytesseract-ocr无法识别重叠字符
重叠字符验证码的识别解决方案
一、图像预处理优化
预处理是提升OCR识别率的核心,针对重叠字符验证码,可通过以下步骤强化字符特征:
- 灰度化+自适应二值化:将彩色图转为灰度图,再用自适应阈值处理,弱化背景干扰,突出重叠字符的轮廓:
import cv2 import numpy as np # 读取图片 img = cv2.imread("captcha.png") # 转灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应二值化,适配局部光照差异 thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
- 噪声清理:用形态学开运算过滤小噪点,同时保留字符边缘细节:
kernel = np.ones((2, 2), np.uint8) cleaned_img = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
- 字符分割识别:通过轮廓检测提取单个字符区域,再逐个识别,避开重叠干扰:
import pytesseract contours, _ = cv2.findContours(cleaned_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 按x坐标排序轮廓,保证字符顺序正确 contours = sorted(contours, key=lambda c: cv2.boundingRect(c)[0]) captcha_text = "" for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) # 过滤无效小轮廓 if w > 8 and h > 15: char_img = cleaned_img[y:y+h, x:x+w] # 单字符模式识别,指定字符集 char = pytesseract.image_to_string(char_img, config='--psm 10 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') captcha_text += char.strip() print("识别结果:", captcha_text)
二、使用专门的验证码识别模型
如果预处理后pytesseract仍无法有效识别,可采用针对性的深度学习模型:
- 收集同格式的重叠验证码数据集(可自行生成或批量获取同类型样本),训练一个轻量CNN模型,输入预处理后的图像,输出字符序列。
- 选用开源的验证码识别预训练模型,这类模型通常针对扭曲、重叠等复杂场景做过优化,能直接适配你的需求。
三、优化pytesseract配置参数
针对验证码场景,调整参数可提升识别精度:
--psm 10:强制单字符识别模式,适合分割后的独立字符--oem 3:启用默认的OCR引擎组合模式tessedit_char_whitelist:指定验证码可能的字符范围(比如大写字母+数字),减少识别候选集
内容的提问来源于stack exchange,提问作者Poojashree M R
相关产品推荐
相关产品推荐

