验证码在防止自动化攻击中扮演了重要角色,而使用 OCR(光学字符识别)技术可以实现对验证码内容的自动解析和提取。在本文中,我们将使用 Python 结合 Tesseract OCR 来完成英文数字验证码的识别任务。
环境配置
安装 Python 和依赖库
首先,确保您已经安装了 Python。若尚未安装,请访问 Python 官方网站下载并安装。
接下来,安装以下必要的 Python 库:
pytesseract:Tesseract OCR 的 Python 接口。
Pillow:用于加载和处理图像。
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 OCR 官方页面下载并安装适合的版本。安装完成后,记得将 Tesseract 的安装路径添加到环境变量中。
安装完成后,可通过以下命令验证安装是否成功:
bash
tesseract --version
编写验证码识别代码
以下代码展示了一个简单的示例,用于识别英文数字组成的验证码:
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_image.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 7")
输出结果
print(f"识别的验证码内容是:{recognized_text.strip()}")
代码解析
图像加载与预处理
使用 Pillow 加载验证码图片,并将其转为灰度图像(ImageOps.grayscale),以去除颜色干扰。
利用 OpenCV 的 cv2.threshold 方法对图像进行二值化处理,将图像分割为黑白两部分,以增强对比度,突出文本部分。
OCR 识别
使用 pytesseract.image_to_string 方法将图像中的文字转换为字符串。
配置参数 --psm 7 告诉 Tesseract OCR 以单行模式处理图像,这是验证码识别的常用设置。
保存处理后图像
处理后的图像保存为 processed_captcha.png,可以检查是否达到理想的预处理效果。
运行代码
将代码保存为 captcha_solver.py,并将目标验证码图片保存为 captcha_image.png,确保它们位于同一目录下。然后运行以下命令:
bash
python captcha_solver.py
如果一切顺利,程序将输出识别结果,例如:
text
识别的验证码内容是:X3K7L
示例演示
输入图像:
原始验证码图片 captcha_image.png
处理后图像:
二值化后的图像 processed_captcha.png
输出结果:
text
识别的验证码内容是:8H5J2
提高识别率的技巧
若初始识别效果不佳,可尝试以下方法:
改进图像预处理:
应用模糊或锐化滤波器。
使用形态学操作(如膨胀或腐蚀)去除噪声。
调整 Tesseract 参数:
修改页面分割模式(PSM)参数:
--psm 6:假设图像包含多行文本。
--psm 8:逐字处理图像。
增加 OCR 的置信度阈值。
训练 Tesseract:
如果验证码使用自定义字体,可通过训练 Tesseract 来识别特定字体和样式。