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
相关产品推荐
相关产品推荐

