使用 Python 和 Tesseract 实现验证码识别
验证码识别是一个常见且实用的技术需求,尤其是在自动化测试和数据采集场景中。通过开源 OCR(Optical Character Recognition,光学字符识别)工具 Tesseract,结合 Python 的强大生态,我们可以高效实现验证码识别任务。本篇博客将以详细步骤和代码示例,介绍如何使用 Python 和 Tesseract 实现验证码识别,包括原理解析、图像预处理、代码实现以及优化策略。
一、验证码识别的背景与难点
1.1 什么是验证码?
验证码(CAPTCHA, Completely Automated Public Turing test to tell Computers and Humans Apart)是一种区分用户是人类还是计算机程序的技术。常见的验证码类型包括:
- 文本验证码:图片中包含扭曲或噪声干扰的字符。
- 图片验证码:用户需要选择特定内容的图片。
- 行为验证码:要求用户拖动滑块或完成特定任务。
1.2 验证码识别的应用场景
- 自动化测试:绕过验证码验证,以便进行完整的自动化测试。
- 数据采集:识别网页中的验证码,自动登录或提交表单。
- 辅助功能:为视障用户提供验证码读取功能。
1.3 验证码识别的挑战
- 图像噪声:许多验证码包含背景噪声、干扰线条或色块。
- 字符扭曲:为了增加识别难度,字符通常被扭曲或旋转。
- 字符连体:字符之间的分隔不明确,需要精确分割。
二、Tesseract 简介
Tesseract 是一个由 Google 维护的开源 OCR 引擎,支持多种语言和字符识别。它可以通过 Python 的 pytesseract
库调用,轻松实现文字识别功能。
2.1 Tesseract 的主要特点
- 多语言支持:Tesseract 支持超过 100 种语言。
- 易于扩展:支持自定义训练,适应特定场景的需求。
- 开源免费:无需授权费用,适用于商业项目。
2.2 Tesseract 的核心流程
- 图像预处理:将图像转化为适合 OCR 的格式。
- 文字区域检测:识别图像中的文字区域。
- 字符识别:将文字区域的像素转换为字符。
- 输出文本:生成最终的文字结果。
三、环境准备
在开始编码之前,需要完成以下环境的配置。
3.1 安装 Tesseract
1. Linux
sudo apt update
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
2. macOS
通过 Homebrew 安装:
brew install tesseract
3. Windows
从 Tesseract 官方 GitHub 下载 Windows 安装包,并配置环境变量。
3.2 安装 Python 库
安装 pytesseract
和图像处理相关库:
pip install pytesseract pillow opencv-python
四、验证码识别的实现
4.1 读取并显示图片
我们将使用 Pillow
和 OpenCV
库来加载和显示验证码图片。
from PIL import Image
import cv2# 加载验证码图片
image_path = "captcha.png"
image = cv2.imread(image_path)# 使用 OpenCV 显示图片
cv2.imshow("Captcha", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.2 图像预处理
为了提高识别率,我们需要对验证码图片进行预处理,包括灰度化、二值化和噪声去除。
1. 转灰度图像
灰度化将彩色图片转换为黑白图片,简化处理。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray Image", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 二值化
二值化通过阈值将图片转换为黑白两色,突出文字部分。
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("Binary Image", binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 去噪声
使用形态学操作(如开运算)去除图片中的干扰点。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
denoised = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
cv2.imshow("Denoised Image", denoised)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.3 调用 Tesseract 进行识别
使用 pytesseract
调用 Tesseract 识别处理后的验证码图片。
import pytesseract
from PIL import Image# 将处理后的图片保存为临时文件
cv2.imwrite("processed_captcha.png", denoised)# 使用 pytesseract 识别
text = pytesseract.image_to_string("processed_captcha.png", config="--psm 6")
print(f"识别结果: {text}")
五、优化识别效果
5.1 调整 Tesseract 参数
通过修改 Tesseract 的 --psm
参数,可以改变文字布局分析模式,例如:
--psm 6
:假设为一个块的文字。--psm 7
:将图像作为一行文字处理。
5.2 设置白名单字符
如果验证码的字符范围已知,可以设置白名单,提高识别准确率。
custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz'
text = pytesseract.image_to_string("processed_captcha.png", config=custom_config)
print(f"识别结果: {text}")
5.3 自定义训练模型
如果验证码的字符样式特殊,可以通过 Tesseract 的训练工具定制模型,以提升识别率。
六、完整代码示例
以下是整合图像预处理和验证码识别的完整代码:
import cv2
import pytesseract# 加载图片
image_path = "captcha.png"
image = cv2.imread(image_path)# 转为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化处理
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 去除噪声
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
denoised = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)# 保存预处理后的图片
cv2.imwrite("processed_captcha.png", denoised)# 使用 pytesseract 进行文字识别
custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz'
text = pytesseract.image_to_string("processed_captcha.png", config=custom_config)# 输出识别结果
print(f"识别结果: {text}")# 显示处理后的图片
cv2.imshow("Processed Image", denoised)
cv2.waitKey(0)
cv2.destroyAllWindows()
七、总结
通过本文的介绍,我们学习了如何使用 Python 和 Tesseract 实现验证码识别,并通过图像预处理和参数优化提高识别率。在实际项目中,结合深度学习模型可以进一步提升复杂验证码的识别效果。希望本篇博客对您有所帮助!
相关文章:
使用 Python 和 Tesseract 实现验证码识别
验证码识别是一个常见且实用的技术需求,尤其是在自动化测试和数据采集场景中。通过开源 OCR(Optical Character Recognition,光学字符识别)工具 Tesseract,结合 Python 的强大生态,我们可以高效实现验证码识…...
Opencv学习
Long time no see!哈哈,假期终于有时间做一点自己喜欢的东西了 还是想说,每天花一点时间投在自己喜欢的事情上,或者专攻一些平时不学的方向,真的很酷! 图片绘制 对于图像绘制,可以分为:图像创…...
数学大模型MAmmoTH:通过混合说明调整建立数学通才模型
向悦和陈文虎是该项目的主要作者。他们这个项目推出 MAmmoTH,这是一系列专为解决一般数学问题而定制的开源大型语言模型 (LLM)。 MAmmoTH 模型在 MathInstruct 上进行训练,MathInstruct 是我们精心策划的指令调整数据集。 MathInstruct 已编译 来自 13 个…...
springboot 配置多数据源以及动态切换数据源
场景 我们springboot项目,通常会有多个数据库,例如mysql,vertica,postgresql等等数据库,通常我们需要动态切换使用我们想要的数据库,这时候就需要配置多数据源了 多数据源特性 支持多数据库类型:例如,同…...
计算机图形学:实验三 光照与阴影
一、程序功能设计 设置了一个3D渲染场景,支持通过键盘和鼠标控制交互,能够动态调整光源位置、物体材质参数等,具有光照、阴影和材质效果的场景渲染。 OpenGL物体渲染和设置 创建3D物体:代码中通过 openGLObject 结构体表示一个…...
idea修改模块名导致程序编译出错
本文简单描述分别用Idea菜单、pom.xml文件管理项目模块module 踩过的坑: 通过idea菜单创建模块,并用idea菜单修改模块名,结构程序编译报错,出错的代码莫名奇妙。双击maven弹窗clean时,还是报错。因为模块是新建的&am…...
Arcgis国产化替代:Bigemap Pro正式发布
在数字化时代,数据如同新时代的石油,蕴含着巨大的价值。从商业决策到科研探索,从城市规划到环境监测,海量数据的高效处理、精准分析与直观可视化,已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…...
RNN实现阿尔茨海默症的诊断识别
本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…...
大数据学习(36)- Hive和YARN
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析
在Windows系统中,你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效,如图: 你可以使用以下代码: import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …...
计算机的错误计算(二百二十一)
摘要 利用一个数学解题器化简计算 实验表明,即使是数学解题器,也是一派胡言。 有一读者来信,询问数学大模型的推理事宜。现就前面的案例继续做一讨论。 例1. 化简计算摘要中算式。 下面是与一个数学解题器的对话。 点评: &am…...
小利特惠源码/生活缴费/电话费/油卡燃气/等充值业务类源码附带承兑系统
全新首发小利特惠/生活缴费/电话费/油卡燃气/等充值业务类源码附带U商承兑系统 安装教程如下 图片:...
外部flash烧写算法学习笔记(一)
一,STM32CubeProgrammer STM32下载编程工具 | STM32CubeProg介绍、下载、安装和使用教程 - 知乎 1.使用速览 2.外部烧写 二,QSPI外部烧写算法制作 STM32H7的花式玩转SPI Flash章节也更新了,含MDK下载算法制作和STM32CubeProg下载算法制作 …...
嵌入式MCU面试笔记2
目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道,通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…...
差分轮算法-两个轮子计算速度的方法-阿克曼四轮小车计算方法
四轮驱小车的话: 转向角度计算方法:float turning_angle z_angular / x_linear; // 转向角度,单位为弧度 速度的话直接用线速度 两轮驱动小车: 计算公式: leftSpeed x_linear - z_angular * ORIGINBOT_WHEEL_TRACK /…...
解释器模式
在软件开发的诸多场景中,我们有时需要处理特定领域的语言或表达式。例如,在数据库查询中,我们使用 SQL 语句来查询数据;在数学计算软件里,需要解析和计算各种数学表达式。解释器模式(Interpreter Pattern&a…...
代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)
目录 一、链表理论基础 二、链表相交求解思路 三、相关算法题目 四、疑点 一、链表理论基础 代码随想录 二、链表相交求解思路 链表相交时,是结点的位置,也就是指针相同,不是结点的数值相同; 思路:定义两个指针…...
戴尔电脑用u盘重装系统_戴尔电脑用u盘重装win10系统教程
戴尔电脑用u盘重装系统?戴尔电脑这几年默认预装win10家庭版和win11家庭版。有的用户用上了预装win11家庭版的戴尔电脑,使用一段时间依然不习惯,于是想退回win10。但不知道怎么重装win10,这几年的戴尔电脑建议采用U盘方式安装系统比…...
http的请求体各项解析
一、前言 做Java开发的人员都知道,其实我们很多时候不单单在写Java程序。做的各种各样的系统,不管是PC的 还是移动端的,还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言,再做业务开发时&#…...
【MARK】Cline配合FreeAPI,再薅亿点点token
说明 自从用了cline,token消耗的速度就开始起飞。各家免费的几百万Token,看起来挺多,实际用起来还是顶不住几天~ FreeAPI是个简单的替代,上下文长度还是不如官方API,所以还是推荐使用官方,这个只是玩具&a…...
如何使用CRM数据分析优化销售和客户关系?
嘿,大家好!你有没有想过为什么有些公司在市场上如鱼得水,而另一些却在苦苦挣扎?答案可能就藏在他们的销售策略和客户关系管理(CRM)系统里。今天我们要聊的就是如何通过有效的 CRM 数据分析来提升你的销售额…...
c语言数组详解
前言 一、数组的定义: 二、数组的初始化: 1.如何给数组赋初值: 1.1逐个赋值: 1.2使用花括号初始化: 1.3使用等号赋值: 2.不同的初始化方式 2.1使用循环初始化: 2.2使用默认初始化: 三…...
EasyNVR免费版已发布!EasyNVR接入海康NVR大华NVR宇视NVR天地伟业NVR接入各种IPC摄像机工业监控家庭监控
EasyNVR不用多说了,驰名已久!之前一直是收费的,不管多少个摄像机接入都是收费的,这就导致,很多个人用户,或者说是家庭用户,家里就那么两三个摄像机,想通过EasyNVR接入NAS系统&#x…...
GSI快速收录服务:让你的网站内容“上架”谷歌
辛苦制作的内容无法被谷歌抓取和展示,导致访客无法找到你的网站,这是会让人丧失信心的事情。GSI快速收录服务就是为了解决这种问题而存在的。无论是新上线的页面,还是长期未被收录的内容,通过我们的技术支持,都能迅速被…...
vue2的$el.querySelector在vue3中怎么写
这个也属于直接操作 dom 了,不建议在项目中这样操作,不过我是在vue2升级vue3的时候遇到的,是以前同事写的代码,也没办法 先来看一下对比 在vue2中获取实例是直接通过 this.$refs.xxx 获取绑定属性 refxxx 的实例,并且…...
C++ list 容器用法
C list 容器用法 C 标准库提供了丰富的功能,其中 <list> 是一个非常重要的容器类,用于存储元素集合,支持双向迭代器。<list> 是 C 标准模板库(STL)中的一个序列容器,它允许在容器的任意位置快速…...
双目立体校正和Q矩阵
立体校正 对两个摄像机的图像平面重投影,使二者位于同一平面,而且左右图像的行对准。 Bouguet 该算法需要用到双目标定后外参(R,T) 从上图中可以看出,该算法主要分为两步: 使成像平面共面 这个办法很直观ÿ…...
又是一年啊
又是一年 回顾2024一、2024的愿望二、愿望实现了吗?三、总结 展望2025几个愿望~~(终于快写完了)~~ 华丽结尾 回顾2024 一、2024的愿望 1.CSP-J上岸; 2.小升初上岸; 3.数学进入联赛班; 4.初一期末年级前五…...
Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅
一、引言 在当今数字化时代,构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架,以其快速开发、简洁配置和丰富的生态支持,深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架ÿ…...
简识JVM私有内存区域栈、数据结构
前记:JVM稀有内存区域栈包含:虚拟机栈、本地方法栈、程序计数器; 在JVM(Java虚拟机)中,私有内存区域栈主要指的是虚拟机栈(VM Stack)和本地方法栈(Native Method Stack&…...
【C++基础】多线程并发场景下的同步方法
如果在多线程程序中对全局变量的访问没有进行适当的同步控制(例如使用互斥锁、原子变量等),会导致多个线程同时访问和修改全局变量时发生竞态条件(race condition)。这种竞态条件可能会导致一系列不确定和严重的后果。…...
【优选算法】10----无重复字符的最长子串
---------------------------------------begin--------------------------------------- 题目解析: 看到这一类题目,有没有那种一眼就感觉时要用到滑动窗口的感觉,铁子们? 讲解算法原理: 方法一: 暴力解法ÿ…...
C语言程序设计十大排序—冒泡排序
文章目录 1.概念✅2.冒泡排序🎈3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一,每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法,排序后的数据更易于处理和查找。在计算机发展…...
26考研资料分享 百度网盘
基础班: 通过网盘分享的文件:2026【考研数学】等3个文件 链接:https://pan.baidu.com/s/1djzJiut1h0DH8WmrI05YHg?pwd1234 提取码:1234--来自百度网盘超级会员v3的分享 通过网盘分享的文件:01、2026【考研政治】 链接:https://pan.baidu.…...
C++ lambda表达式
目录 1.lambda表达式 1.1什么是Lambda表达式? 1.2Lambda表达式的语法 1.3捕捉列表 1.4函数对象与lambda表达式 1.lambda表达式 1.1什么是Lambda表达式? Lambda表达式是C11标准引入的一种匿名函数,它允许你在需要函数的地方直接编写代码…...
halo附件图片迁移到easyimage图床
前言 在使用 markdown 编写文章之后,markdown 内容中引用的图片都是图床的地址 部分文章是在 halo 没有使用图床前,就已经发布了的,这些图片都是直接存储在 halo 系统中的 需要将这些文章的图片全部迁移到图床上,这些文章的图片…...
Grafana
Grafana 是一款广泛使用的开源数据可视化与监控平台,通过与 Prometheus、InfluxDB、Elasticsearch 等多种数据源集成,提供强大的监控、数据展示和告警功能。其告警体系在及时通知系统异常、保障业务稳定性方面起到关键作用。 Grafana 告警体系概述 Graf…...
前端性能优化:HMR热更新和预获取加载
最近发现项目开发,有点加载快,有点却是卡机式,甚至刷新导致白屏情况。于是,我找开发和性能优化的方法,找到下面几种。 本文将深入探讨 预获取(Prefetch)、动态导入(Dynamic Import&…...
OpenCV相机标定与3D重建(66)对立体匹配生成的视差图(disparity map)进行验证的函数validateDisparity()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用左右检查来验证视差。矩阵 “cost” 应该由立体对应算法计算。 cv::validateDisparity 函数是 OpenCV 库中用于对立体匹配生成的视差图&…...
git reset (取消暂存,保留工作区修改)
出现这种情况的背景:我不小心把node_modules文件添加到暂存区了,由于文件过大,导致不能提交,所以我想恢复之前的状态,但又不想把修改的代码恢复为之前的状态,所以使用这个命令可以只恢复暂存区的状态&#…...
【论文+源码】diffuseq使用扩散模型和diffuseq-v2的序列文本生成序列,并且桥接离散和连续的文本空间,用于加速SEQ2SEQ扩散模型。
这篇论文介绍了一种名为DIFFUSEQ的新型扩散模型,专门针对序列到序列(SEQ2SEQ)文本生成任务进行设计。尽管扩散模型在视觉和音频等连续信号领域取得了成功,但在自然语言处理特别是条件生成方面的适应仍然未被广泛探索。通过广泛的评…...
考研机试题:打印日期
描述 给出年分m和一年中的第n天,算出第n天是几月几号。 输入描述: 输入包括两个整数y(1<y<3000),n(1<n<366)。 输出描述: 可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。 …...
Ubuntu 20.04 x64下 编译安装ffmpeg
试验的ffmpeg版本 4.1.3 本文使用的config命令 ./configure --prefixhost --enable-shared --disable-static --disable-doc --enable-postproc --enable-gpl --enable-swscale --enable-nonfree --enable-libfdk-aac --enable-decoderh264 --enable-libx265 --enable-libx…...
springboot使用ssl连接elasticsearch
使用es时ssl证书报错 unable to find valid certification path to requested target 1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>2…...
虚拟头节点和双指针解决链表问题(合并,与分解操作,力扣题目为例)
Problem: 21. 合并两个有序链表 Problem: 86. 分隔链表 文章目录 总览说明题目描述思路复杂度Code总结分析 总览说明 在解决链表相关的算法题目时较多使用到的技巧就是虚拟头节点、双指针,而题目往往都会涉及到对链表的分解、合并操作,本文选择两个题目将…...
JavaScript系列(38)-- WebRTC技术详解
JavaScript WebRTC技术详解 🎥 今天,让我们深入了解WebRTC(Web Real-Time Communication)技术,这是一种支持网页浏览器进行实时语音对话或视频对话的技术。 WebRTC基础概念 🌟 💡 小知识&…...
分布式理解
分布式 如何理解分布式 狭义的分布是指,指多台PC在地理位置上分布在不同的地方。 分布式系统 分布式系**统:**多个能独立运行的计算机(称为结点)组成。各个结点利用计算机网络进行信息传递,从而实现共同的“目标或者任…...
JVM学习指南(48)-JVM即时编译
文章目录 即时编译(Just-In-Time Compilation, JIT)概述为什么JVM需要即时编译?即时编译与传统的静态编译的区别JVM中的即时编译器HotSpot VM中的C1和C2编译器编译器的作用和位置即时编译的工作流程代码的加载和解释执行热点代码检测编译优化编译优化技术公共子表达式消除循…...
python http调用视觉模型moondream
目录 一、什么是moondream 二、资源地址 三、封装了http进行接口请求 四、代码解析 解释 可能的改进 一、什么是moondream Moondream 是一个针对视觉生成任务的深度学习模型,专注于图像理解和生成,包括图像标注(captioning)、问题回答(Visual Question Answering,…...
【竞技宝】DOTA2:NAVI junior被ESL取消参赛资格
北京时间1月24日,DOTA2目前有多个赛事的预选赛正在如火如荼的进行之中,其中ESLOne罗利站的预选赛已经结束,参赛正赛的队伍也已经全部产生。除了因EPT积分而拿到直邀资格的PARI、BB、falcons、liquid之外,tundra、NAVI junior、spirit、nigma、XG、talon、SR、HEROIC也通过各赛区…...