一、项目背景
图像验证码广泛应用于防止爬虫、自动注册和暴力破解等安全场景。验证码的复杂性不断提升,传统 OCR 难以直接识别。本文将利用 Python 构建一个支持图像预处理与 OCR 相结合的验证码识别模块,并具备可扩展能力以支持不同类型验证码。
二、核心依赖
库/工具 功能描述
cv2 (OpenCV) 图像灰度化、二值化、腐蚀等操作
pytesseract 基于 Tesseract 的 OCR 工具
Pillow 图像格式兼容和转换
Tesseract 本地 OCR 引擎(系统依赖)
安装方式:
pip install opencv-python pillow pytesseract
并安装 Tesseract OCR 引擎(例如 Windows 安装后配置环境变量)。
三、模块结构设计
captcha_recognizer/
│
├── main.py # 主运行入口
├── preprocessor.py # 图像预处理模块
├── ocr_engine.py # OCR 调用模块
└── test_samples/ # 测试验证码图像样例
四、图像预处理逻辑(preprocessor.py)
预处理阶段目的是增强图像对比度、去除背景噪声,利于后续识别:
import cv2
def preprocess_image(image_path: str) -> str:
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 自适应阈值处理
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY_INV, 25, 10)# 中值滤波 + 腐蚀
median = cv2.medianBlur(thresh, 3)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
processed = cv2.erode(median, kernel, iterations=1)output_path = "temp_processed.png"
cv2.imwrite(output_path, processed)
return output_path
五、OCR 模块封装(ocr_engine.py)
将 OCR 抽象为可配置的识别接口,便于后续更换引擎或添加模型。
from PIL import Image
import pytesseract
def recognize_text(image_path: str) -> str:
image = Image.open(image_path)
config = r'-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 --psm 7'
text = pytesseract.image_to_string(image, config=config)
return text.strip()
六、运行主逻辑(main.py)
整合所有模块,支持输入路径或文件夹批处理识别:
from preprocessor import preprocess_image
from ocr_engine import recognize_text
def recognize_captcha(image_path: str):
processed_path = preprocess_image(image_path)
result = recognize_text(processed_path)
print(f"[结果] {image_path} -> {result}")
if name == "main":
import sys
path = sys.argv[1] if len(sys.argv) > 1 else "test_samples/sample1.png"
recognize_captcha(path)
运行示例:
python main.py test_samples/123AB.png
输出:
[结果] test_samples/123AB.png -> 123AB
七、增强建议
增强功能 说明
字符分割(切割图像) 对字符粘连验证码,需分割单字符识别
TensorFlow/PyTorch 模型 可训练 CNN 模型进行自定义识别
多线程/异步识别 批量验证码识别效率提升
API 接口封装 使用 Flask/Django 暴露 Web 服务