使用 Python 实现验证码识别
验证码是一种常见的防止机器人攻击的机制,它通过要求用户输入一串扭曲的字母和数字来验证是否为人类。在本教程中,我们将使用 Python 和 Tesseract OCR 技术来自动识别并提取验证码内容。通过图像处理和 OCR(光学字符识别),我们能够实现这一目标。
- 环境准备
安装 Python 和所需库
确保已经安装 Python。如果还没有安装,可以访问 Python 官网下载并安装。
接下来,使用 pip 安装以下依赖库:
pytesseract:Python 的 Tesseract OCR 接口。
Pillow:一个流行的 Python 图像处理库。
opencv-python:用于图像处理,特别是对验证码图片的预处理。
在终端或命令行中运行以下命令来安装:
bash
更多内容访问ttocr.com或联系1436423940
pip install pytesseract pillow opencv-python
安装 Tesseract OCR
Tesseract 是本教程中使用的 OCR 引擎。需要根据操作系统进行安装:
Linux:
bash
sudo apt install tesseract-ocr
macOS(使用 Homebrew):
bash
brew install tesseract
Windows: 从 Tesseract 官方页面 下载并安装适合的版本。安装后,请将 Tesseract 的路径(如 C:\Program Files\Tesseract-OCR\tesseract.exe)添加到系统的环境变量中。
安装完成后,通过以下命令确认 Tesseract 是否已正确安装:
bash
tesseract --version
2. 编写验证码识别程序
以下是完整的 Python 代码,用于加载验证码图片,进行预处理,并通过 Tesseract OCR 识别验证码内容:
python
import pytesseract
from PIL import Image, ImageOps
import cv2
设置 Tesseract 的路径(Windows 用户需要根据实际安装路径修改)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
加载验证码图片
image_path = "captcha.png" # 替换为验证码图片路径
image = Image.open(image_path)
转换为灰度图像,减少颜色干扰
gray_image = ImageOps.grayscale(image)
使用 OpenCV 进一步处理图像(如二值化)
gray_cv_image = cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2GRAY)
_, binary_image = cv2.threshold(gray_cv_image, 128, 255, cv2.THRESH_BINARY)
可选:保存处理后的图像以检查效果
cv2.imwrite("processed_captcha.png", binary_image)
使用 Tesseract OCR 进行识别
recognized_text = pytesseract.image_to_string(binary_image, config="--psm 6")
打印识别结果
print(f"识别的验证码内容是:{recognized_text.strip()}")
3. 代码解析
- 加载和预处理图片
使用 Pillow 库加载验证码图片,并将其转换为灰度图像,减少颜色干扰。
使用 OpenCV 进行二值化处理(黑白化),进一步增强文字与背景的对比度。 - OCR 识别
pytesseract.image_to_string() 用于从图像中提取文本。通过设置 config="--psm 6",Tesseract 会假定图像是包含多行文本的普通文档,这种设置适合验证码图片。 - 输出识别结果
程序会打印出 Tesseract 识别出的验证码文本。 - 运行代码
将上面的代码保存为 captcha_recognition.py,并确保你有一张验证码图片(如 captcha.png)。然后运行以下命令:
bash
python captcha_recognition.py
如果一切正常,程序会输出识别的验证码内容,例如:
text
识别的验证码内容是:G9R8L
5. 示例演示
输入图像:
假设验证码图片 captcha.png 的内容为:
处理后图像:
经过二值化处理后的图像 processed_captcha.png:
输出结果:
text
识别的验证码内容是:G9R8L
6. 提高识别效果的技巧
如果识别结果不理想,可以尝试以下优化方法:
-
优化图像预处理
去噪声:使用图像模糊或形态学操作(如腐蚀、膨胀)去除噪声。
自适应二值化:使用自适应阈值方法(如 cv2.adaptiveThreshold())来处理不同亮度的验证码图像。 -
调整 Tesseract 参数
页面分割模式:Tesseract 的 --psm(页面分割模式)参数可以根据图像的布局调整:
--psm 6:多行文本模式(默认模式)。
--psm 7:单行文本模式,适合验证码。 -
训练 Tesseract
如果验证码使用自定义字体,Tesseract 可能无法正确识别。这时,可以通过提供训练数据来提高识别率。Tesseract 支持训练和自定义语言文件,以便识别特定字体和字符集。 -
使用深度学习方法
对于复杂的验证码(如扭曲或添加噪声的验证码),基于深度学习的 OCR 模型(如 CRNN)可以提供更高的准确度。PaddleOCR 和 EasyOCR 都是不错的选择,可以在这些框架中实现更强大的验证码识别功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异