验证码识别:使用OCR技术识别图形验证码详解
文章目录
- 一、基本原理
- 二、所需工具
- 2.1 Python环境
- 2.2 图像处理库
- 2.3 OCR引擎
- 2.4 Python接口
- 三、实现步骤
- 3.1 获取验证码图像
- 3.2 图像预处理
- 3.3 使用OCR进行字符识别
- 3.4 基本 OCR 识别样例
- 四、提高识别准确率的方法
- 4.1 字符分割
- 4.2 使用深度学习模型
- 4.3 数据增强
- 4.4 集成多个OCR引擎
- 五、实际应用中的注意事项
- 六、总结
验证码(CAPTCHA)是一种用于区分人类用户和自动化程序的安全机制,广泛应用于网站登录、注册、表单提交等场景。然而,在某些自动化任务(如数据抓取、自动化测试等)中,可能需要绕过这些验证码。本文将详细介绍如何使用
OCR(光学字符识别)技术识别图形验证码,包括基本原理、所需工具、具体实现步骤以及提高识别准确率的方法。
一、基本原理
OCR技术通过分析图像中的字符形状,将其转换为可编辑的文本。对于图形验证码,OCR技术需要处理以下挑战:
-
噪声干扰:验证码图像中常包含噪点、线条等干扰元素。 -
字符扭曲:字符可能被扭曲、旋转或变形。 -
字体多样:验证码使用各种不同的字体和样式。 -
背景复杂:背景颜色和图案可能与字符混淆。
二、所需工具
2.1 Python环境
确保已安装Python 3.x版本。
2.2 图像处理库
Pillow:用于图像的基本处理。
OpenCV:强大的计算机视觉库,用于高级图像处理。
pip install Pillow opencv-python
2.3 OCR引擎
Tesseract:开源的OCR引擎,支持多种语言和字符集。各平台安装Tesseract如下:
Windows:
- 下载安装包:Tesseract at UB Mannheim
- 安装过程中记下安装路径(例如 C:\Program Files\Tesseract-OCR)。
- 将安装路径添加到系统环境变量 PATH 中。
macOS:
brew install tesseract
Linux(以Ubuntu为例):
sudo apt-get update
sudo apt-get install tesseract-ocr
2.4 Python接口
pytesseract:Tesseract的Python封装。
pip install pytesseract
三、实现步骤
3.1 获取验证码图像
首先,需要获取待识别的验证码图像。可以通过以下方式获取:
- 从网页下载:使用requests库下载验证码图片。
- 从本地文件读取。
示例:从URL下载验证码图像
import requests
from PIL import Image
from io import BytesIO# 验证码图片URL
url = 'https://example.com/captcha.png'# 发送HTTP请求获取图片
response = requests.get(url)
image = Image.open(BytesIO(response.content))# 保存到本地(可选)
image.save('captcha.png')
3.2 图像预处理
为了提高OCR的识别准确率,需要对图像进行预处理,包括灰度化、二值化、去噪、字符分割等。
灰度化:将图像转换为灰度图。二值化:将图像转换为黑白图。去噪:去除图像中的噪声。降噪:去除干扰线或点。
示例:基本的图像预处理
from PIL import Image, ImageEnhance, ImageFilter
import cv2
import numpy as np# 打开图像
image = Image.open('captcha.png')# 转换为灰度图
image = image.convert('L')# 二值化处理
threshold = 128
image = image.point(lambda x: 255 if x > threshold else 0, '1')# 去噪处理
image = image.filter(ImageFilter.MedianFilter())# 使用OpenCV进行进一步处理(可选)
img_np = np.array(image)
img_np = cv2.GaussianBlur(img_np, (5, 5), 0)
img_np = cv2.threshold(img_np, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]# 保存预处理后的图像
processed_image = Image.fromarray(img_np)
processed_image.save('processed_captcha.png')
3.3 使用OCR进行字符识别
使用Tesseract对预处理后的图像进行OCR识别。
示例1:使用pytesseract进行识别
import pytesseract# 如果Tesseract不在系统PATH中,需要指定其路径
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'# 执行OCR识别
captcha_text = pytesseract.image_to_string(processed_image, config='--psm 7')print(f'识别的验证码: {captcha_text}')
示例2:使用第三方 OCR 服务
如果本地 OCR 效果不佳,可以使用第三方 OCR 服务(如 Google Vision API、百度 OCR 等)。以下是使用百度 OCR 的示例:
安装百度 OCR SDK:pip install baidu-aip,使用百度 OCR 识别验证码示例如下:
from aip import AipOcr# 设置百度 OCR 的 AppID、API Key 和 Secret Key
APP_ID = 'your_app_id'
API_KEY = 'your_api_key'
SECRET_KEY = 'your_secret_key'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)# 读取图像
def get_file_content(file_path):with open(file_path, 'rb') as fp:return fp.read()image_path = 'captcha.png'
image = get_file_content(image_path)# 调用百度 OCR
result = client.basicGeneral(image)
if 'words_result' in result:text = result['words_result'][0]['words']print(f"识别结果: {text}")
else:print("识别失败")
3.4 基本 OCR 识别样例
以下是一个简单的 OCR 识别示例:
from PIL import Image
import pytesseract# 设置 Tesseract 路径(Windows 需要)
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'# 打开验证码图片
image_path = 'captcha.png'
image = Image.open(image_path)# 使用 Tesseract 识别文本
text = pytesseract.image_to_string(image)
print(f"识别结果: {text}")
四、提高识别准确率的方法
由于验证码设计的复杂性,单一的OCR方法可能无法达到理想的识别效果。以下是一些提高识别准确率的方法:
4.1 字符分割
将验证码中的字符逐个分割,分别进行识别,可以减少干扰并提高准确率。
import cv2# 转换为灰度图
gray = cv2.cvtColor(np.array(processed_image), cv2.COLOR_RGB2GRAY)# 二值化
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 查找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)characters = []
for contour in contours:(x, y, w, h) = cv2.boundingRect(contour)# 过滤过小的区域if w > 10 and h > 20:character = binary[y:y+h, x:x+w]characters.append(character)# 识别每个字符
captcha_text = ''
for char_img in characters:char_text = pytesseract.image_to_string(char_img, config='--psm 10')captcha_text += char_text.strip()print(f'识别的验证码: {captcha_text}')
4.2 使用深度学习模型
对于复杂的验证码,传统的OCR方法可能效果不佳。此时,可以考虑使用基于深度学习的模型,如卷积神经网络(CNN)进行训练和识别。
示例1:使用Keras构建简单的CNN模型
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense# 假设已有训练数据X_train和标签y_train
model = Sequential([Conv2D(32, (3,3), activation='relu', input_shape=(height, width, 1)),MaxPooling2D((2,2)),Conv2D(64, (3,3), activation='relu'),MaxPooling2D((2,2)),Flatten(),Dense(64, activation='relu'),Dense(num_classes, activation='softmax')
])model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))
示例2:一个简单的深度学习模型训练示例:
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models
from sklearn.model_selection import train_test_split
from PIL import Image
import os# 加载数据集
def load_data(data_dir):images = []labels = []for filename in os.listdir(data_dir):if filename.endswith('.png'):image_path = os.path.join(data_dir, filename)image = Image.open(image_path).convert('L') # 转换为灰度图image = image.resize((64, 64)) # 调整大小image = np.array(image) / 255.0 # 归一化images.append(image)labels.append(filename.split('_')[0]) # 假设文件名格式为 "label_xxx.png"return np.array(images), np.array(labels)# 加载数据
data_dir = 'captcha_dataset'
images, labels = load_data(data_dir)# 将标签转换为 one-hot 编码
labels = tf.keras.utils.to_categorical(labels, num_classes=36) # 假设有 36 个类别(0-9, A-Z)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(images, labels, test_size=0.2, random_state=42)# 构建模型
model = models.Sequential([layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 1)),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.MaxPooling2D((2, 2)),layers.Flatten(),layers.Dense(128, activation='relu'),layers.Dense(36, activation='softmax') # 36 个类别
])# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 训练模型
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))# 保存模型
model.save('captcha_model.h5')
示例3:使用训练好的模型进行预测:
from tensorflow.keras.models import load_model# 加载模型
model = load_model('captcha_model.h5')# 预处理输入图像
def preprocess_image(image_path):image = Image.open(image_path).convert('L')image = image.resize((64, 64))image = np.array(image) / 255.0image = np.expand_dims(image, axis=0) # 添加批次维度return image# 预测
image_path = 'test_captcha.png'
processed_image = preprocess_image(image_path)
prediction = model.predict(processed_image)
predicted_label = np.argmax(prediction, axis=1)
print(f"预测结果: {predicted_label}")
4.3 数据增强
通过对训练数据进行旋转、缩放、平移等变换,增加数据的多样性,提高模型的泛化能力。
from tensorflow.keras.preprocessing.image import ImageDataGeneratordatagen = ImageDataGenerator(rotation_range=10,width_shift_range=0.1,height_shift_range=0.1,shear_range=0.1,zoom_range=0.1,horizontal_flip=False,fill_mode='nearest'
)datagen.fit(X_train)
model.fit(datagen.flow(X_train, y_train, batch_size=32),epochs=10, validation_data=(X_val, y_val))
4.4 集成多个OCR引擎
结合多个OCR引擎的结果,通过投票或加权平均的方式,提高最终的识别准确率。
五、实际应用中的注意事项
法律和道德问题:在未经授权的情况下,绕过验证码可能违反网站的使用条款。请确保在合法和道德的范围内使用OCR技术。
验证码类型:不同类型的验证码(如图形验证码、滑动验证码、点击验证码等)需要不同的处理方法。本文主要介绍图形验证码的识别。
反爬虫机制:许多网站会不断更新其验证码机制,以防止自动化工具的破解。因此,OCR方法可能需要不断调整和优化。
性能考虑:OCR识别可能需要较长的处理时间,尤其是在批量处理大量验证码时。可以考虑并行处理或优化算法以提高效率。
六、总结
使用Python和OCR技术识别图形验证码是一项具有挑战性的任务,尤其当验证码设计得较为复杂时。
- 对于简单的验证码,可以使用 Tesseract OCR 结合图像预处理技术进行识别。
- 对于复杂的验证码,可以训练深度学习模型来提高识别率。
- 如果本地 OCR 效果不佳,可以使用第三方 OCR 服务。
通过合理的图像预处理、特定的Tesseract配置以及必要时使用深度学习模型,可以显著提高识别的准确率。然而,在实际应用中,需权衡技术实现的难度与法律道德的约束,确保合法合规地进行自动化操作。
相关文章:
验证码识别:使用OCR技术识别图形验证码详解
文章目录 一、基本原理二、所需工具2.1 Python环境2.2 图像处理库2.3 OCR引擎2.4 Python接口 三、实现步骤3.1 获取验证码图像3.2 图像预处理3.3 使用OCR进行字符识别3.4 基本 OCR 识别样例 四、提高识别准确率的方法4.1 字符分割4.2 使用深度学习模型4.3 数据增强4.4 集成多个…...
剑指 Offer II 033. 变位词组
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20033.%20%E5%8F%98%E4%BD%8D%E8%AF%8D%E7%BB%84/README.md 剑指 Offer II 033. 变位词组 题目描述 给定一个字符串数组 strs ,将 变位词 组合在一起…...
【苍穹外卖】问题笔记
【DAY1 】 1.VCS找不到 好吧,发现没安git 接着发现安全模式有问题,点开代码信任此项目 2.导入初始文件,全员爆红 好像没maven,配一个 并在设置里设置好maven 3.启用注解,见新手苍穹 pom.xml改lombok版本为1.1…...
微信小程序 - 自定义实现分页功能
概述 在微信小程序项目中,没有现成的分页器组件,所以需要自定义实现分页功能 自定义实现分页功能 1、index.json {"usingComponents": {"van-button": "vant/weapp/button/index"} }这里使用 Vant Weapp 中的 van-butt…...
1.1部署es:9200
安装es:root用户: 1.布署java环境 - 所有节点 wget https://d6.injdk.cn/oraclejdk/8/jdk-8u341-linux-x64.rpm yum localinstall jdk-8u341-linux-x64.rpm -y java -version 2.下载安装elasticsearch - 所有节点 wget ftp://10.3.148.254/Note/Elk/…...
《模拟器过检测教程:Nox、雷电、Mumu、逍遥模拟器 Magisk、LSposed 框架安装与隐藏应用配置》
一、夜神模拟器 (Nox) 过检测 使用版本:7.0.6.2(20250209) 1. 准备工作 将需要用到的应用放入文件夹: C:\Users\Administrator.DESKTOP-I5V50SS\Nox_share\Download 2. 安装面具鸭(Magisk) 在模拟器下…...
人工智能、机器学习、深度学习和大语言模型之间的关系
人工智能(AI)、机器学习(ML)、深度学习(DL)和大语言模型(LLM)之间是逐层包含且技术递进的关系,具体如下: 1. 层级关系 人工智能(AI)…...
上传securecmd失败
上传securecmd失败 问题描述:KES V8R6部署工具中,节点管理里新建节点下一步提示上传securecmd失败,如下: 解决办法: [rootlocalhost ~]# yum install -y unzip 上传的过程中会解压,如果未安装unzip依赖包…...
C++:dfs,bfs各两则
1.木棒 167. 木棒 - AcWing题库 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过 5050 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序…...
Python在实际工作中的运用-通用格式CSV文件自动转换XLSX
继续上篇《Python在实际工作中的运用-CSV无损转XLSX的几个方法》我们虽然对特定格式的CSV实现了快速转换XLSX的目标,但是在运行Py脚本前,还是需要编辑表格创建脚本和数据插入脚本,自动化程度很低,实用性不强,为减少人工提高效率,实现输入CSV文件路径即可自动适配完成转换…...
P9420 [蓝桥杯 2023 国 B] 子 2023
P9420 [蓝桥杯 2023 国 B] 子 2023 题目 分析代码 题目 分析 刚拿到这道题,我大脑简单算了一下,这个值太大了,直观感觉就很难!! 但是,你仔仔细细的一看,先从最简单的第一步入手,再…...
2025-02-26 学习记录--C/C++-C语言 判断字符串S2是否在字符串S1中
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 C语言 判断字符串S2是否在字符串S1中 #include <stdio.h> // 引入标准输入输出库,用于使用 printf 等函数 #…...
004 Kafka异常处理
6.异常处理 文章目录 6.异常处理1.异常分类与处理原则2.生产者异常处理1. 同步发送捕获异常2. 异步发送回调处理 3.消费者异常处理1.全局异常处理器2.方法级处理3.重试yml配置 4.死信队列(DLQ)配置1. 启用死信队列2. 手动发送到DLQ 5.事务场景异常处理1.…...
创建第一个 Maven 项目(二)
六、添加依赖 在 Maven 项目开发过程中,添加依赖是一项常见且关键的操作。通过添加依赖,我们可以引入项目所需的各种库和框架,极大地扩展项目的功能。接下来,我们将以 JUnit 依赖为例,详细介绍如何在 Maven 项目中添加…...
游戏引擎学习第124天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天,我们已经介绍了多线程的一些基础知识,包括如何创建工作队列以及如何在线程中处理任务。今天,重点是解决那些我们之前没有注意到…...
组件的组成和组件的嵌套关系
组件的组成 首先建一个.vue文件,在里面写一个内容: <template> <div><div class"container">{{ message }}</div> </div> </template> <script> export default{data(){return{message:"组件…...
2025 PHP授权系统网站源码
2025 PHP授权系统网站源码 安装教程: PHP7.0以上 先上传源码到服务器,然后再配置伪静态, 访问域名根据操作完成安装, 然后配置伪静态规则。 Ngix伪静态规则: location / { if (!-e $request_filename) { rewrite …...
KIMI K1.5:大规模强化学习在大语言模型中的应用与工程实践
目录 1、核心技术创新:长上下文强化学习 2、策略优化的技术细节 2.1、在线镜像下降变体 2.2、长度惩罚机制 2.3、智能采样策略 3、工程架构创新 3.1、混合部署框架 3.2、代码沙箱与奖励模型 3.3、分布式系统架构 4、实验成果与性能提升 5、结论与未来展望 大语言模…...
Linux MySQL 8.0.29 忽略表名大小写配置
Linux MySQL 8.0.29 忽略表名大小写配置 问题背景解决方案遇到的问题: 问题背景 突然发现有个大写的表报不存在。 在Windows上,MySQL是默认支持忽略大小写的。 这个时候你要查询一下是不是没有配置: SHOW VARIABLES LIKE lower_case_table…...
Vue 中,使用模板(Template) 和 Render 函数编写组件的区别
在 Vue 2 中,模板(Template) 和 Render 函数 是两种不同的组件编写方式,它们各有特点和适用场景。以下是它们的核心区别和实际应用场景分析: 1. 基本区别 特性模板(Template)Render 函数语法形…...
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理 Vuex是Vue.js应用程序中专门用来管理状态的工具,就好像是一个大管家,帮你把项目里一些重要的数据和操作管理得井井有条。下面用大白话结合案例来介绍Vuex核心概…...
ElasticSearch查询指南:从青铜到王者的骚操作
ElasticSearch查询指南:从青铜到王者的骚操作 本文来源于笔者的CSDN原创,由于掘金>已经去掉了转载功能,所以只好重新上传,以下图片依然保持最初发布的水印(如CSDN水印)。(以后属于本人原创均…...
财务运营域——营收稽核系统设计
摘要 本文主要介绍了营收稽核系统的背景、特点与作用。营收稽核系统的产生源于营收管理复杂性、财务合规与审计需求、提升数据透明度与决策效率、防范舞弊与风险管理、技术进步与自动化需求、多元化业务模式以及跨部门协作与数据整合等多方面因素。其特点包括自动化与智能化、…...
30 分钟从零开始入门 CSS
HTML CSS JS 30分钟从零开始入门拿下 HTML_html教程-CSDN博客 30 分钟从零开始入门 CSS-CSDN博客 JavaScript 指南:从入门到实战开发-CSDN博客 前言 最近也是在复习,把之前没写的博客补起来,之前给大家介绍了 html,现在是 CSS 咯…...
threejs:document.createElement创建标签后css设置失效
vue3threejs,做一个给模型批量CSS2D标签的案例,在导入模型的js文件里,跟着课程写的代码如下: import * as THREE from three; // 引入gltf模型加载库GLTFLoader.js import { GLTFLoader } from three/addons/loaders/GLTFLoader.…...
【GESP】C++三级练习 luogu-p1567, 统计天数
GESP三级,一维数组,多层循环和分支练习,难度★✮☆☆☆。 题目题解详见:https://www.coderli.com/gesp-3-luogu-p1567/ 【GESP】C三级练习 luogu-p1567, 统计天数 | OneCoderGESP三级,一维数组,多层循环和…...
springboot集成deepseek4j
1、文档地址 快速开始 - 零基础入门Java AI 免费的模型 Models 2、pom文件依赖 parent依赖 <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency>&…...
SpringBoot中报错:JSON parse error: Unrecognized filed 异常原因和解决方案
问题描述 当使用Spring Boot或其他JSON解析库(如Jackson)将JSON字符串反序列化为Java对象时,可能会遇到以下异常: JSON parse error: Unrecognized field "<fieldName>" (class <ClassName>), not marked…...
【数据分析】4 商业数据分析技能模型总结
优秀的商业分析师需要具备的能力 数据分析能力逻辑思维能力赢得结果能力 一、数据分析能力扩展:工具链生态与进阶场景 1. 数据获取技术升级 企业级数据源管理: 数据湖架构(AWS S3/阿里云OSS)与数据仓库(Snowflake/R…...
vue+element-dialog:修改关闭icon / 遮罩层不能挡住弹窗 / 遮罩层不能遮挡元素
一、是否显示操作按钮 二、修改dialog默认关闭icon .el-dialog__headerbtn {top: 15px !important;width: 18px;height: 18px;background: url(~assets/img/formworkManagement/close-button.png) left no-repeat;background-size: cover; } .el-dialog__headerbtn i {content…...
