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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:15:41