tesseract直接识别验证码大概率失败,因其默认配置专为清晰印刷体设计,而验证码含噪点、干扰线、扭曲或粘连,导致切分错误、输出为空或乱码;必须经灰度化、自适应二值化、去噪膨胀三步预处理,并显式配置--psm 8、字符白名单等参数。

为什么直接用 tesseract 识别验证码大概率失败
因为原始验证码图通常含噪点、干扰线、字符扭曲或粘连,tesseract 默认配置专为清晰印刷体设计,对这类图像几乎无法正确切分和识别。不预处理就调用 pytesseract.image_to_string(img),结果常为空字符串或乱码。
必须做的三步图像预处理
核心目标是让每个字符尽可能“干净、独立、对比度高”。不用复杂模型,靠 OpenCV 或 PIL 就能解决:
- 转灰度:
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)或img.convert('L') - 二值化:用自适应阈值比固定阈值更稳,推荐
cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) - 去噪与膨胀:先用
cv2.medianBlur()消小噪点,再用cv2.dilate()加粗字符(尤其对细字体有效),结构元建议np.ones((2,2), dtype=np.uint8)
pytesseract 的关键参数怎么设
默认参数完全不适合验证码。必须显式指定语言、OCR引擎模式(OEM)和页面分割模式(PSM):
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
lang='eng':即使中文验证码也先用英文模型——它对单字符、无上下文的识别更鲁棒 -
config='--oem 3 --psm 8 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz':其中--psm 8表示“单行单字”,强制按字符级识别;tessedit_char_whitelist限定输出范围,大幅减少误识 - 避免用
--psm 7(单行文本),它会尝试连字识别,对验证码反而更差
识别失败时优先检查这三点
不是模型不行,而是输入没达标:
- 图像尺寸太小:缩放到宽度 ≥ 300 像素再处理,
tesseract对小图分辨率极度敏感 - 字符间距过近:预处理后用
cv2.findContours()检查是否能分离出 4–6 个独立轮廓,否则需加腐蚀/开运算切分粘连 - 字体颜色与背景对比不足:二值化前先做直方图均衡(
cv2.equalizeHist())或 CLAHE,尤其对低对比验证码有效
真正难的不是调参,而是把一张图变成 tesseract “愿意认”的样子——它不理解验证码,只认像素排列规律。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










