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

使用 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. 自动化测试:绕过验证码验证,以便进行完整的自动化测试。
  2. 数据采集:识别网页中的验证码,自动登录或提交表单。
  3. 辅助功能:为视障用户提供验证码读取功能。

1.3 验证码识别的挑战

  1. 图像噪声:许多验证码包含背景噪声、干扰线条或色块。
  2. 字符扭曲:为了增加识别难度,字符通常被扭曲或旋转。
  3. 字符连体:字符之间的分隔不明确,需要精确分割。

二、Tesseract 简介

Tesseract 是一个由 Google 维护的开源 OCR 引擎,支持多种语言和字符识别。它可以通过 Python 的 pytesseract 库调用,轻松实现文字识别功能。

2.1 Tesseract 的主要特点

  • 多语言支持:Tesseract 支持超过 100 种语言。
  • 易于扩展:支持自定义训练,适应特定场景的需求。
  • 开源免费:无需授权费用,适用于商业项目。

2.2 Tesseract 的核心流程

  1. 图像预处理:将图像转化为适合 OCR 的格式。
  2. 文字区域检测:识别图像中的文字区域。
  3. 字符识别:将文字区域的像素转换为字符。
  4. 输出文本:生成最终的文字结果。

三、环境准备

在开始编码之前,需要完成以下环境的配置。

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 读取并显示图片

我们将使用 PillowOpenCV 库来加载和显示验证码图片。

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 的强大生态,我们可以高效实现验证码识…...

谈一谈前端构建工具的本地代理配置(Webpack与Vite)

在Web前端开发中,我们在本地写代码经常遇到的一件事情就是代理配置。代理配置说简单也简单,配置一次基本就一劳永逸,但有时候配置不对,无论如何也连不上后端,就成了非常头疼的一件事。在这本文中,我们讨论一…...

CentOS7非root用户离线安装Docker及常见问题总结、各种操作系统docker桌面程序下载地址

环境说明 1、安装用户有sudo权限 2、本文讲docker组件安装,不是桌面程序安装 3、本文讲离线安装,不是在线安装 4、目标机器是内网机器,与外部网络不连通 下载 1、下载离线安装包,并上传到$HOME/basic-tool 目录 下载地址&am…...

Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案

在微服务体系中,Nacos 主要承担“服务注册与发现、配置中心”的职能,Gateway(如 Spring Cloud Gateway)通常负责“路由转发、过滤、安全鉴权、灰度流量控制”等功能,而 Nginx 则常被用作“边缘反向代理”或“统一流量入…...

+-*/运算符优先级计算模板

acwing3302 知识点一&#xff1a;有关unordered_map的优先级 头文件<unordered_map>,然后进行符号优先级定义 定义方式unordered_map<char,int>pr{ {,1},{-,1},{*,2},{/,2}};其余没定义的默认为0 知识点二&#xff1a;头文件<cctype>中的isdigit()是判断…...

GPT 结束语设计 以nanogpt为例

GPT 结束语设计 以nanogpt为例 目录 GPT 结束语设计 以nanogpt为例 1、简述 2、分词设计 3、结束语断点 1、简述 在手搓gpt的时候&#xff0c;可能会遇到一些性能问题&#xff0c;即关于是否需要全部输出或者怎么节约资源。 在输出语句被max_new_tokens 限制&#xff0c…...

FastDFS的安装及使用

分布式存储发展历程 前段时间 618 活动火热进行&#xff0c;正是购物的好时机。当我们访问这些电 商网站的时候&#xff0c;每一个商品都会有各式各样的图片展示介绍&#xff0c;这些图 片一张两张可以随便丢在服务器的某个文件夹中&#xff0c;可是电商网站如此 大体量的…...

C++ lambda表达式

目录 1.lambda表达式 1.1什么是Lambda表达式&#xff1f; 1.2Lambda表达式的语法 1.3捕捉列表 1.4函数对象与lambda表达式 1.lambda表达式 1.1什么是Lambda表达式&#xff1f; Lambda表达式是C11标准引入的一种匿名函数&#xff0c;它允许你在需要函数的地方直接编写代码…...

react页面定时器调用一组多个接口,如果接口请求返回令牌失效,清除定时器不再触发这一组请求

为了实现一个React页面使用定时器调用一组多个接口&#xff0c;并在任意一个接口请求返回令牌失效时清除定时器且不再触发这一组请求&#xff0c;可以遵循以下步骤&#xff1a; 1. 定义API调用函数&#xff1a;创建一个函数来处理一组API调用。每个API调用都应该检查响应状态以…...

Python的泛型(Generic)与协变(Covariant)

今天咱们聊聊Python类型标注中的泛型(Generic),与协变(Covariant)。 不了解类型标注的小伙伴,可以先看一看我的上一篇文章 “Python类型检查” Python 类型检查-CSDN博客 例子 这次我开个宠物商店。看下面代码。 class Animal:passclass Dog(Animal):passclass Cat(A…...

Python Typing: 实战应用指南

文章目录 1. 什么是 Python Typing&#xff1f;2. 实战案例&#xff1a;构建一个用户管理系统2.1 项目描述2.2 代码实现 3. 类型检查工具&#xff1a;MyPy4. 常见的 typing 用法5. 总结 在 Python 中&#xff0c;静态类型检查越来越受到开发者的重视。typing 模块提供了一种方式…...

OpenEuler学习笔记(六):OpenEuler与其他Linux服务器的区别是什么?

OpenEuler是一款基于Linux内核的开源服务器操作系统&#xff0c;与其他Linux服务器操作系统&#xff08;如CentOS、Ubuntu Server等&#xff09;存在多方面的区别&#xff0c;主要体现在以下几个方面&#xff1a; 一、社区与支持 OpenEuler&#xff1a;由华为发起并开源&…...

如何使用CRM数据分析和洞察来支持业务决策和市场营销?

如何使用CRM数据分析和洞察来支持业务决策和市场营销&#xff1f; 大家好&#xff01;今天咱们聊聊一个特别重要的话题——如何利用客户关系管理&#xff08;CRM&#xff09;系统中的数据进行分析与洞察能够帮助我们做出更好的业务决策以及提升市场营销效果。其实啊&#xff0…...

MyBatis和JPA区别详解

文章目录 MyBatis和JPA区别详解一、引言二、设计理念与使用方式1、MyBatis&#xff1a;半自动化的ORM框架1.1、代码示例 2、JPA&#xff1a;全自动的ORM框架2.1、代码示例 三、性能优化与适用场景1、MyBatis&#xff1a;灵活的SQL控制1.1、适用场景 2、JPA&#xff1a;开发效率…...

SVN客户端使用手册

目录 一、简介 二、SVN的安装与卸载 1. 安装&#xff08;公司内部一般会提供安装包和汉化包&#xff0c;直接到公司内部网盘下载即可&#xff0c;如果找不到可以看下面的教程&#xff09; 2. 查看SVN版本 ​编辑 3. SVN卸载 三、SVN的基本操作 1. 检出 2. 清除认证数据 3. 提交…...

VsCode安装文档

一、下载 进入VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined&#xff0c;点击 DownLoad for Windows下载windows版本 当然也可以点击旁边的箭头&#xff0c;下载Windows版本 或 Mac OS 版本 备注&#xff1a; Stable&#xff1a;稳定版Insiders&#…...

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | &#x1f40d; 蛇年运势预测 在线体验地址&#xff1a;蛇年…...

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…...

生信软件管家——conda vs pip

pip vs conda&#xff1a; 安装过python包的人自然两种管理软件都用过&#xff0c; Pip install和Conda install在Python环境中用于安装第三方库和软件包&#xff0c;但它们在多个方面存在显著的区别 总的来说&#xff1a; pip是包管理软件&#xff0c;conda既是包管理软件&…...

代码随想录——串

文章目录 反转字符串反转字符串Ⅱ路径加密反转字符串中的单词动态口令字符串匹配重复的子字符串 反转字符串 344. 反转字符串 //前后对应交换 //0<->sSize-1 //1<->sSize-2 //... //i<->sSize-1-i,i0,1,...,(sSize-1)/2 void reverseString(char* s, int s…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...