You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:22:09