用 Python 构建可扩展的图像验证码识别模块

一、项目背景
图像验证码广泛应用于防止爬虫、自动注册和暴力破解等安全场景。验证码的复杂性不断提升,传统 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 服务

posted @ 2025-07-28 21:29  ttocr、com  阅读(13)  评论(0)    收藏  举报