当前位置: 首页 > news >正文

基于图像处理与SVM的验证码识别系统实现

一、引言
验证码(CAPTCHA)作为互联网身份验证的第一道防线,广泛用于防止恶意爬虫和自动操作。尽管深度学习方法已成为主流,传统机器学习方法如支持向量机(SVM)在处理结构化、规则清晰的验证码中依然具有较高效率与鲁棒性。本文结合图像处理与SVM,构建了一个轻量化验证码识别系统,具有良好的实用性与解释性。

二、验证码类型说明
本系统识别的是4位数字验证码,图像尺寸为 100x40,背景为白色,字符为黑色,存在少量噪点和干扰线,无旋转或扭曲变形。

三、开发环境
Python 3.9+
更多内容访问ttocr.com或联系1436423940
OpenCV

scikit-learn

numpy

pillow(用于生成验证码)

pip install opencv-python scikit-learn numpy pillow
四、数据集生成(generate_captcha.py)

from captcha.image import ImageCaptcha
import os, random
from PIL import Image
import string

CHARS = string.digits
captcha_gen = ImageCaptcha(width=100, height=40)

def generate_dataset(n=5000, save_dir="dataset"):
os.makedirs(save_dir, exist_ok=True)
for i in range(n):
text = ''.join(random.choices(CHARS, k=4))
img = captcha_gen.generate_image(text)
img.save(os.path.join(save_dir, f"{text}_{i}.png"))

generate_dataset()
五、图像预处理(preprocess.py)

import cv2
import numpy as np

def preprocess_image(path):
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
_, binary = cv2.threshold(img, 150, 255, cv2.THRESH_BINARY_INV)
return binary

def segment_characters(image):
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
chars = []
for cnt in sorted(contours, key=lambda c: cv2.boundingRect(c)[0]):
x, y, w, h = cv2.boundingRect(cnt)
if w > 5 and h > 10:
char_img = image[y:y+h, x:x+w]
resized = cv2.resize(char_img, (20, 20))
chars.append(resized)
return chars
六、特征提取与模型训练(train_svm.py)

import os
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
from preprocess import preprocess_image, segment_characters

X, y = [], []

for file in os.listdir("dataset"):
if file.endswith(".png"):
label = file.split("_")[0]
img = preprocess_image(os.path.join("dataset", file))
chars = segment_characters(img)
if len(chars) == 4:
for i, ch in enumerate(chars):
X.append(ch.flatten())
y.append(label[i])

X = np.array(X) / 255.0
y = np.array(y)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = svm.SVC(kernel='linear')
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print("测试集准确率:", accuracy_score(y_test, y_pred))

import joblib
joblib.dump(model, 'svm_model.pkl')
七、验证码识别测试(predict.py)

import joblib
from preprocess import preprocess_image, segment_characters

def recognize(path):
model = joblib.load("svm_model.pkl")
img = preprocess_image(path)
chars = segment_characters(img)
result = ''
for ch in chars:
vec = ch.flatten().reshape(1, -1) / 255.0
result += model.predict(vec)[0]
return result

print(recognize("dataset/1234_10.png"))

http://www.sczhlp.com/news/298.html

相关文章:

  • 基于因子图与和积算法的MATLAB实现
  • 【文献阅读】AnyEdit:编辑语言模型中编码的任何知识
  • Web前端入门第 82 问:JavaScript cookie 有大小限制吗?溢出会怎样?
  • 二分
  • lazarus无法编译Linux下的动态库
  • 微信小程序提示不在合法域名问题
  • Clop勒索团伙针对MoveIt Transfer软件的大规模攻击活动分析
  • 语音解耦技术推动语音AI的多样性与包容性
  • 银河麒麟V10离线安装 tomcat 9 记录
  • fiddler篡改数据
  • Docker
  • SpringMVC具体的工作流程
  • SketchUp 2021+必备插件|AFU321 v5.5.6安装与使用说明
  • SketchUp纹理神器:Architextures插件安装与使用教程(图文详解)
  • redis-基本使用
  • nepCTF2025 pwn题解
  • 论文解读《GradEscape: A Gradient-Based Evader Against AI-Generated Text Detectors》
  • 使用 DeepSpeed ZeRO、LoRA 和 Flash Attention 微调 Falcon 180B
  • 28、快捷键
  • linux系统添加Arial字体
  • 基于卷积神经网络的验证码识别系统设计与实现
  • 【数据库索引标准结构】B+树原理详解与B树对比优势
  • 12N90-ASEMI电源逆变器专用12N90
  • Locust入门及最佳实践
  • Gitee Git自建平台:企业级代码托管的安全之选
  • Java核心面试技术
  • 人力资源各系统的关联与一体化趋势:从独立到协同的必然之路
  • 评估Gitee作为DevOps平台:功能详解与适用性分析
  • business
  • 4、如何给一万张图片重命名