代码分享|使用Python和Tesseract来识别图形验证码
字数 2071 2025-08-18 11:37:07
使用Python和Tesseract识别图形验证码 - 详细教学文档
1. 概述
本教程将详细介绍如何使用Python和Tesseract OCR引擎来识别图形验证码。这种方法特别适用于企业内网应用或非互联网企业的简单验证码识别需求。
2. Tesseract OCR简介
Tesseract OCR引擎最初由HP实验室开发,曾是OCR业内最准确的三款识别引擎之一。2005年由Google接手并作为开源项目发布。
特点:
- 提供独立程序和API两种使用方式
- 对于纯白色背景、字符规整无干扰的验证码可直接识别
- 支持通过API集成到自定义程序中
3. 环境准备
3.1 系统要求
- 操作系统:RHEL 7.4 64位(或其他Linux发行版)
- Python环境
3.2 依赖安装
安装图形库依赖
yum install 所需的图形库依赖
安装Leptonica
- 从Leptonica官网下载1.74以上版本
- 编译安装:
./configure
make
make install
- 设置环境变量:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
安装Tesseract
- 从Tesseract项目主页获取源码
- 编译安装:
./autogen.sh
./configure --with-extra-libraries=/usr/local/lib
make
make install
下载语言数据文件
- 下载英语数据文件
eng.traineddata(3.04/3.05版本) - 放入目录:
/usr/local/share/tessdata
4. Python封装Tesseract API
4.1 封装模块
使用C++ API(TessBaseAPI类)封装为Python模块,核心函数是TessBaseAPI::TesseractRect
项目地址:https://github.com/penoxcn/Decaptcha
包含文件:
- setup.py
- decaptcha.i
- decaptcha.h
- depcaptcha.cpp
4.2 编译安装
python setup.py install
注意:
- 需要先安装swig
- 如果Tesseract不在默认路径,需修改setup.py中的路径
4.3 验证安装
from decaptcha import Decaptcha
如果报错找不到libtesseract,解决方案:
- 将Tesseract库目录添加到
/etc/ld.so.conf并执行ldconfig - 或在Python代码中添加:
import sys
sys.path.append("/usr/local/lib")
5. 安装Python图像处理库
5.1 安装PIL(Python Imaging Library)
- 从PIL官网下载最新版(1.1.7)
- 确保系统已安装png/jpeg/tiff等图像库
- 编译安装:
python setup.py install
5.2 基本使用示例
from PIL import Image
img = Image.open('test.png') # 打开图像文件
img = img.convert("RGBA") # 转换为RGBA格式
pixdata = img.load() # 获取像素数据
width, height = img.size # 获取图像尺寸
print('imgsize: %dx%d' % (width, height))
print('pixel[2,4]:', pixdata[2, 4]) # 示例输出:(0xD3,0xD3,0xD3,0xFF)
6. 验证码识别实战流程
6.1 基本识别流程
- 用Image加载图像并转为RGBA格式
- 获取像素数据
- 将RGBA像素数据二值化为0和1的字节串
- 调用decaptcha模块进行识别
- 获取验证码字符串
6.2 五种验证码示例及处理策略
示例1:aa系列
- 特征:字符颜色偏白,背景偏黑
- 二值化条件:
r+g+b >= 480则为1,否则为0
示例2:bb系列
- 特征:字符有颜色,背景偏白色
- 二值化条件:
int(r/240)+int(g/240)+int(b/240) <=1则为1,否则为0
示例3:cc系列
- 特征:字符和背景都是单色,有不固定位置的点干扰
- 处理策略:判断像素右边和下边的点是否都是白色背景
示例4:dd系列
- 特征:字符颜色偏紫色,有背景干扰线
- 发现:字符像素的G通道值都为0
- 二值化条件:基于G通道值判断
示例5:ee系列(最复杂)
- 特征:来自securimage php库,有干扰线、干扰点、字符变形
- 处理策略:
- 统计找出背景颜色(出现次数最多的颜色)
- 计算字符颜色与背景颜色的偏差
- 找出干扰线、字符与背景色的偏差阈值范围
- 应用阈值进行二值化
6.3 识别效果统计
| 验证码组 | 样本数 | 完全正确识别数 | 识别率 |
|---|---|---|---|
| aa | 10 | 5 | 50% |
| bb | 10 | 3 | 30% |
| cc | 10 | 9 | 90% |
| dd | 10 | 3 | 30% |
| ee | 10 | 4 | 40% |
6.4 与requests库结合使用
import requests
import StringIO
r = requests.get(imgurl) # 下载验证码图片
imgbuf = StringIO.StringIO(r.content) # 创建内存文件对象
img = Image.open(imgbuf) # 从内存加载图像
7. 提高识别率的策略
- 样本训练:通过训练Tesseract可以提高识别准确率
- 多次尝试:即使识别率30%,连续识别5次获得至少一次正确识别的概率达86%
- 组合策略:结合多种二值化方法提高成功率
8. 总结
本教程展示了:
- Tesseract OCR的安装和配置
- Python封装Tesseract API的方法
- 使用PIL处理验证码图像
- 多种验证码的二值化策略
- 实际识别效果和优化思路
这种方法特别适合需要快速实现验证码识别而不想深入研究复杂OCR理论的场景。虽然识别率可能不是100%,但对于自动化测试和渗透测试等场景已经足够实用。