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

Python使用tesseract识别验证码图片输出为空如何解决

验证码识别无输出问题排查及解决方案

核心问题排查方向

  • 裁剪坐标适配问题:首先检查captcha1.png是否完整包含验证码内容,你当前写死的裁剪坐标(30, 138, 355, 210)会受浏览器窗口大小、屏幕分辨率、页面缩放比例影响,一旦截图尺寸变化,裁剪出来的图片可能不含有效验证码内容,自然无法识别。
  • Tesseract识别参数缺失:默认识别配置不适配验证码场景,需指定页面分割模式(PSM)和字符白名单,减少误判和空输出。
  • 二值化图像明暗反转:Tesseract默认要求深色文字+浅色背景,如果你的二值化结果是浅色文字+深色背景,需要先做反色处理再识别。
  • 形态学操作参数不合理:当前闭运算使用默认3x3卷积核,要么会把细碎的字符笔画消掉,要么无法有效清除背景噪点,干扰识别结果。

修改后可运行代码

import numpy as np # 新增依赖,用来定义形态学卷积核

screenshot_name = "captcha.png"
driver.save_screenshot(screenshot_name)

# 裁剪验证码区域,建议后续优化为动态计算验证码元素坐标,不要写死
img = Image.open("captcha.png")
area = (30, 138, 355, 210)
cropped_img = img.crop(area)
cropped_img.save('captcha1.png')

# 验证码预处理
img = cv2.imread("captcha1.png")
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(h, w) = gry.shape[:2]
gry = cv2.resize(gry, (w*2, h*2), interpolation=cv2.INTER_CUBIC) # 用三次插值放大,保留字符边缘
# 自定义闭运算卷积核
kernel = np.ones((2, 2), np.uint8)
cls = cv2.morphologyEx(gry, cv2.MORPH_CLOSE, kernel)
thr = cv2.threshold(cls, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# 自动判断是否需要反色
white_pixel = np.sum(thr == 255)
black_pixel = np.sum(thr == 0)
if white_pixel < black_pixel:
    thr = cv2.bitwise_not(thr)

# Tesseract识别增加专用参数:psm 7代表识别单行文本,限制字符集为数字+大小写字母
txt = tess.image_to_string(thr, config='--psm 7 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
# 去除识别结果首尾的空白字符
txt = txt.strip()
print(txt)

额外优化建议

  • 后续可通过Selenium定位到验证码元素,调用location和size属性动态计算裁剪范围,适配不同窗口尺寸,避免硬编码坐标失效。
  • 如果依然识别不准,可以在转灰度图之后增加高斯模糊步骤去除噪点:gry = cv2.GaussianBlur(gry, (3,3), 0)。

内容的提问来源于stack exchange,提问作者Fook

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 02:09:02