用tesseract配合基础图像预处理可应对简单验证码,但对加噪、弯曲、粘连类效果差;需灰度化、高斯模糊、otsu二值化及可选闭运算,并配置psm 8、限定字符集等参数。

直接上结论:用 tesseract 配合基础图像预处理,能应付大多数无扭曲、无干扰线、字体清晰的图片验证码;但遇到加噪、弯曲、粘连的验证码,准确率会断崖式下跌,这时候硬上 OCR 不如换接口或人工标注。
为什么不能直接调 pytesseract.image_to_string() 就完事?
多数验证码图自带干扰——比如浅色噪点、随机线条、字符轻微旋转或粘连。原图直接喂给 tesseract,它会把噪点当笔画、把干扰线当字符边缘,结果常是空字符串或乱码。
-
tesseract默认识别语言是英文,中文需额外加载chi_sim或chinese语言包(注意版本兼容性) - 输入图像必须是灰度或二值图,彩色图会大幅降低识别稳定性
- 字符高度低于 10 像素时,
tesseract极易漏字;建议先 resize 到最小字符高度 ≥ 15px
怎么用 OpenCV 做最简预处理?
目标不是“完美还原”,而是让每个字符轮廓干净、分离、对比度高。以下几步缺一不可:
- 用
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)转灰度 - 用
cv2.GaussianBlur(gray, (3,3), 0)模糊降噪(核大小别超 5,否则模糊字符) - 用
cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)自适应二值化 - 若字符粘连,再跑一次
cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)(kernel = np.ones((1,2), dtype=np.uint8)横向微连接即可)
别做中值滤波或大尺寸膨胀——那会让本就细的字符糊成一团。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
调用 pytesseract 时关键参数怎么设?
默认参数面向文档扫描图,对验证码几乎无效。必须显式约束:
config='--psm 8 --oem 3 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz'-
psm 8表示“单行文本”,避免 tesseract 尝试段落分析 -
oem 3是默认 LSTM 引擎,比旧版更适应小图 -
tessedit_char_whitelist严格限定字符集,大幅减少误识(比如验证码只含数字,就写0123456789)
如果返回空或长度不对,先检查预处理后图像是否真的“白底黑字”——tesseract 只认黑字白底,反色图要加 -c invert_images=true(但不如直接 255 - binary 可靠)。
真正难的不是代码跑通,是判断这张验证码到底适不适合 OCR:字符间距是否均匀、背景是否纯色、有无透视变形。这些肉眼一眼能看出的问题,算法很难补救。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










