使用Python识别验证码失败求助:部分验证码返回空字符串
验证码识别返回空字符串的解决方案
当前代码仅通过简单二值化处理图像,对存在干扰线、噪点的验证码适配性差,导致识别失败。可通过优化图像预处理和Tesseract识别参数解决问题:
1. 增强图像预处理
针对目标验证码的干扰特征,添加去噪、形态学操作消除干扰,让字符更清晰:
img = cv2.imread('ss.png', 0) # 高斯模糊减少噪点 img = cv2.GaussianBlur(img, (3, 3), 0) # 反二值化:让字符为白色,背景为黑色,提升识别对比度 img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 开运算(腐蚀+膨胀)消除细干扰线 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
2. 优化Tesseract识别参数
指定字符范围(仅大写字母+数字),并设置合适的页面分割模式(PSM),减少识别误差:
imagetext = ptes.image_to_string(img, config='--psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
--psm 6:告诉Tesseract假设输入是单一均匀的文本块tessedit_char_whitelist:限定识别范围,过滤无关字符
3. 完整修改后的代码
def read_captcha(): ptes.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' try: img = cv2.imread('ss.png', 0) # 增强预处理 img = cv2.GaussianBlur(img, (3, 3), 0) img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 优化识别参数 imagetext = ptes.image_to_string(img, config='--psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') except TypeError: imagetext="a b" # 拼接字符(简化写法) s = ''.join(imagetext.split()) return s if s else ""
内容的提问来源于stack exchange,提问作者Vicky Agarwal
相关产品推荐
相关产品推荐

