查看: 627|回复: 3

Python Pillow + pytesseract 图片验证码预处理

[复制链接]
发表于 昨天 11:00 | 显示全部楼层 |阅读模式
验证码识别是爬虫自动化、批量数据录入中的常见需求。本文基于 Pillow 和 pytesseract 实现基础图片验证码识别流程,涵盖安装、图像预处理(灰度化、二值化、去噪)以及调用 OCR 引擎提取文字。

## 环境准备
需要安装 Python 包以及 Tesseract-OCR 引擎。通过 pip 安装依赖:
  1. pip install pytesseract Pillow
复制代码
Tesseract-OCR 引擎需单独安装。Windows 用户可前往 UB-Mannheim 的 GitHub 发布页下载对应安装包(https://github.com/UB-Mannheim/tesseract/wiki)。安装时注意记录安装路径,并确保将 Tesseract 添加到系统环境变量 PATH 中,或后续在代码中手动指定 tesseract_cmd。

## 图片预处理函数
验证码图片通常包含干扰线、背景噪声、颜色变化等,直接识别准确率较低。因此先进行预处理:灰度化、增强对比度、二值化、去噪。
  1. from PIL import Image, ImageFilter, ImageEnhance
  2. def preprocess_image(image_path):
  3.     """预处理验证码图片"""
  4.     img = Image.open(image_path)
  5.     # 灰度化,将 RGB 转为单通道
  6.     img = img.convert('L')
  7.     # 增强对比度,让文字与背景差异更明显
  8.     enhancer = ImageEnhance.Contrast(img)
  9.     img = enhancer.enhance(2.0)
  10.     # 二值化:像素值大于 127 设为 255(白),否则设为 0(黑)
  11.     img = img.point(lambda x: 255 if x > 127 else 0)
  12.     # 中值滤波去噪,核大小设为 3
  13.     img = img.filter(ImageFilter.MedianFilter(size=3))
  14.     return img
复制代码
参数说明:
- `image_path`:图片文件路径。
- `convert('L')`:将图片转为灰度图(L 模式)。
- `ImageEnhance.Contrast`:对比度增强器,`enhance(2.0)` 将对比度乘 2。
- `point(lambda x: ...)`:对每个像素应用阈值函数,实现二值化。
- `MedianFilter(size=3)`:3x3 中值滤波器,消除孤立噪点。

## OCR 识别函数
使用 pytesseract 的 `image_to_string` 方法,并将 OCR 引擎模式设为 PSM 7(将图像视为单行文本)。
  1. import pytesseract
  2. def recognize_captcha(image_path):
  3.     img = preprocess_image(image_path)
  4.     # config: --psm 7 表示 Treat the image as a single text line
  5.     text = pytesseract.image_to_string(img, config='--psm 7')
  6.     return text.strip()
复制代码
注意:若 Tesseract 未在 PATH 环境变量中,需在代码开头设置:
  1. pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
复制代码

## 完整调用示例
  1. if __name__ == '__main__':
  2.     captcha_text = recognize_captcha('captcha.png')
  3.     print('识别结果:', captcha_text)
复制代码

## 技术影响与适用场景
本文演示的方法适用于简单数字/字母验证码(无粘连、无旋转、背景干净)。实际应用中,若验证码添加了扭曲、彩色干扰线或字符粘连,需进一步改进预处理流程(如形态学操作、轮廓分析、字符分割)。Pillow 提供了丰富的图像处理函数(如 `ImageFilter.GaussianBlur`、`ImageEnhance.Sharpness`),可根据具体验证码特点调整参数。pytesseract 本质是 Tesseract OCR 引擎的 Python 封装,识别英文字母和数字效果较好,中文验证码需使用中文语言包(`pytesseract.image_to_string(img, lang='chi_sim')`)。

该方案不依赖深度学习模型,部署简单且识别速度较快,适合作为爬虫自动化的初始验证码破解方案。若识别率不足,可考虑引入图像旋转校正、字符分割后单独识别等进阶手段。
回复

使用道具 举报

发表于 昨天 11:10 | 显示全部楼层

Re: Python Pillow + pytesseract 图片验证码预处理

感谢分享!这个基础流程写得很清晰,对刚接触验证码识别的朋友来说很实用。预处理部分的中值滤波去噪和对比度增强确实能提升很多简单验证码的识别率。我平时也常用类似方案,不过遇到那种带扭曲或彩色噪声的验证码时,会在二值化前先做一次灰度拉伸,或者用形态学开闭运算去除细小的干扰线。你后来有没有调整过参数应对更复杂的样本?
回复 支持 反对

使用道具 举报

发表于 昨天 11:10 | 显示全部楼层

Re: Python Pillow + pytesseract 图片验证码预处理

感谢分享!很实用的基础流程,对刚接触验证码识别的同学来说非常友好。我之前也用过类似方法,有个小建议:对于背景有轻微噪点或线条干扰的验证码,二值化阈值可以尝试 Otsu 自动阈值(用 `cv2.threshold` 或 Pillow 里的 `ImageFilter` 结合 `point` 手动计算),效果比固定 127 更稳定。另外,如果验证码字符间距较宽,`--psm 7` 有时会漏字符,可以试试 `--psm 8`(单个单词)。期待后续能分享更多处理粘连或旋转验证码的进阶教程!
回复 支持 反对

使用道具 举报

发表于 昨天 11:10 | 显示全部楼层

Re: Python Pillow + pytesseract 图片验证码预处理

很实用的分享,刚好最近也在折腾验证码识别。我之前遇到的坑是二值化阈值固定127,遇到浅色背景或深色文字的验证码经常识别失败,后来改成用大津法动态计算阈值效果好很多。另外Pillow的`ImageFilter.MinFilter`也可以用来去噪,效果也不错。楼主有试过处理带彩色干扰线的验证码吗?有什么好的经验可以交流下?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-8 01:31 , Processed in 0.028089 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部