Python 验证码识别:用 Pillow+Tesseract 破解图形验证码

验证码识别是自动化测试和数据分析中的常见需求。通过结合 Pillow(图像处理库)和 Tesseract(OCR引擎),可高效破解简单图形验证码。以下是完整实现流程:


1. 核心工具原理
  • Pillow:处理图像预处理(裁剪、二值化、降噪)
  • Tesseract:光学字符识别引擎,支持多语言
  • 识别成功率公式:
    $$识别准确率 = \frac{\text{正确识别字符数}}{\text{总字符数}} \times 100%$$

2. 实现步骤
(1) 安装依赖
pip install pillow pytesseract
# 需单独安装 Tesseract-OCR 引擎(官网下载)

(2) 图像预处理(关键步骤)

使用 Pillow 进行:

  • 灰度化:$Gray = 0.299R + 0.587G + 0.114B$
  • 二值化:$Pixel = \begin{cases} 255 & \text{if } value > threshold \ 0 & \text{otherwise} \end{cases}$
  • 降噪:去除孤立像素点
(3) OCR 识别

调用 Tesseract 提取文本


3. 完整代码示例
from PIL import Image, ImageFilter
import pytesseract

def crack_captcha(image_path):
    # 1. 图像预处理
    img = Image.open(image_path)
    img = img.convert("L")  # 灰度化
    img = img.point(lambda x: 255 if x > 180 else 0)  # 二值化 (阈值180)
    img = img.filter(ImageFilter.MedianFilter())  # 中值滤波降噪
    
    # 2. OCR识别
    text = pytesseract.image_to_string(img, config="--psm 7")
    return text.strip()

# 使用示例
result = crack_captcha("captcha.png")
print(f"识别结果: {result}")


4. 关键参数说明
参数 作用 推荐值
--psm 7 单行文本模式 适用于标准验证码
二值化阈值 分离前景/背景 160-200
中值滤波 消除椒盐噪声 3x3 滤波器

5. 优化方向
  1. 复杂验证码处理
    • 添加形态学操作(膨胀/腐蚀)
    • 分割字符后单独识别
  2. 训练自定义模型
    tesseract --train [训练数据]
    

  3. 对抗干扰线
    • 使用傅里叶变换去除周期性噪声
    • 颜色通道分离(针对彩色干扰)

注意:该方法适用于简单验证码(如纯文本无扭曲)。高级验证码需结合CNN等深度学习方案,准确率可达 $90%+$。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐