Python 轻松去除验证码干扰点,让识别不再犯难

news2024/9/23 1:23:37

Python 轻松去除验证码干扰点,让识别不再犯难

      • 引言
      • 一、干扰点噪声
      • 二、图片降噪
      • 三、测试运行结果
      • 写在最后

作者:高玉涵
时间:2024.8.29 21:52
博客:blog.csdn.net/cg_i
环境:Windows10、Python 3.11.3、PIL、Tesseract-OCR

山高月小,水落石出。

引言

在进行爬虫开发或自动化操作时,我们经常会遇到需要登录网页(或软件)的情况。而在登录过程中,验证码是一个常见且需要特别处理的问题。验证码(CAPTCHA)作为一种区分用户是计算机还是真实人类的程序,经常要求用户输入一些只有真实人类才能轻松解读的信息,以此来有效阻止自动化工具或机器人的恶意操作。处理验证码成为了爬虫和自动化操作过程中的一只拦路虎。验证码按展现形式,又分为静态验证码动态验证码,本文主要讨论关于静态验证码的识别。

随着OCR(光学字符识别)技术日趋完善,有些组织或个人免费(大善)提供了开源的OCR引擎(如,Tesseract-OCR),使得从验证码图片中识别出文字变得容易了些。然而,”道高一尺,魔高一丈“,在此消彼长之时,验证码也相应的增加了多种”噪声“技术以干扰OCR的识别。

限于篇幅,本文关于”噪声“技术的讨论,仅限于干扰点噪声。淡到验证码,必然会涉及验证码字符的识别,我给出的例子代码中会出现Tesseract-OCR引擎的调用。这里我不会详细讨论如何使用它们以及环境搭建,此举旨在突出讨论的重心(对图像操作),我只会在实在绕不过的地方,着以笔墨,稍作解释。关于缺失部分,我会另找时间,单独开一篇另行讨论。这里提前声明,也请大家谅解。

一、干扰点噪声

干扰点噪声,作为一种常见的图像降质现象,表现为图像中随机散布的大量孤立点。这些点的灰度值与周围像素点的灰度值存在显著差异,呈现出类似椒盐噪声的特征。如图(1-1)所示为一个登录界面的示例,而图(1-2)则展示了一个带有干扰点噪声的验证码图片。
在这里插入图片描述

(1-1 登录界面示例)

在这里插入图片描述

(1-2 带干扰点的验证码)

在未经任何预处理的情况下,我们尝试使用Tesseract-OCR来识别图(1-2)中的验证码。首先,将验证码图片下载到本地,然后在图片所在的目录下执行了以下命令:

tesseract 2.png output

然而,执行结果却显示页面为空,如下所示:

Estimating resolution as 150
Empty page!!
Estimating resolution as 150
Empty page!!

从这一提示中,我们可以明显看出OCR识别未能成功。进一步查看输出文件output.txt,其内容果然为空。这是因为干扰点噪声会严重影响OCR算法的识别效果。OCR算法依赖于图像中的文字具有相对清晰和连贯的轮廓,而噪声点的存在会破坏这些轮廓,使得算法无法正确识别文字。

二、图片降噪

通过观察,我发现验证码图片中的干扰点相对简单,因为所有干扰点的颜色都相同。针对这一特点,我可以先获取干扰点的颜色,然后清除它,以达到清除干扰点的目的。具体操作是,首先使用Windows自带的画图工具打开验证码图片,接着使用颜色选取器选取干扰点的颜色值(图2-1),之后点击编辑颜色,此时就可以查看到该颜色的RGB值(图2-2)。
在这里插入图片描述

(2-1 颜色选取器)

在这里插入图片描述

(2-2 RGB值)

干扰点清除代码:

from PIL import Image

def get_noise_color(image):
	w = image.size[0]
	h = image.size[1]
	
	for x in range(w):
		for y in range(h):
			(r, g, b) = image.getpixel((x, y))
			# 干扰点颜色
			if (r,g,b) == (44,90,60):
				# 用它前面像素颜色填充它,思想:相近的颜色对原图影响最小
				image.putpixel((x, y), image.getpixel((x - 1, y)))
			
	return image


def clear_save_image(image_path):
	image = Image.open(image_path)
	image = image.convert('RGB')
	image = get_noise_color(image)
	image.save("2_clear.png")
	

if __name__ == '__main__':
	clear_save_image(r'2.png')

这段代码的具体步骤和代码解释如下:

  1. 导入库:
  • from PIL import Image:从PIL(Python Imaging Library,现在称为Pillow)库中导入Image模块,用于图片处理。
  1. 定义get_noise_color函数:
  • 这个函数接收一个Image对象作为输入。
  • 首先,获取图片的宽度w和高度h
  • 然后,遍历图片中的每一个像素。对于每个像素,获取其RGB颜色值。
  • 如果某个像素的颜色是(44, 90, 60)(噪点颜色),则将这个像素的颜色替换为其前一个像素的颜色(即(x - 1, y)位置的颜色)。
  • 最后,返回处理后的Image对象。
  1. 定义clear_save_image函数:
  • 这个函数接收一个图片路径image_path作为输入。
  • 使用Image.open(image_path)打开并读取图片。
  • 使用image.convert('RGB')将图片转换为RGB模式,确保图片有三个颜色通道。
  • 调用get_noise_color函数去除图片中的噪点。
  • 将处理后的图片保存为"2_clear.png"。
  1. 主函数:
  • 如果直接运行这个脚本,将调用clear_save_image函数,传入一个图片路径(这里是’2.png’),对图片进行处理并保存。

三、测试运行结果

首先,执行这个Pyhton程序:

python .\clear_noisy.py

执行后,会生成一个名为2_clear.png的图片(如图3-1所示),这是清除噪点后的验证码图片。
在这里插入图片描述

(图 3-1 清除噪点后的验证码图片)

接着,我们使用Tesseract-OCR来识别处理后的图像。执行以下命令:

tesseract 2_clear.png output
Estimating resolution as 133

此时,明显可以看出较上次,输出的结果明显不同。为了进一步验证,我们打开output.txt文件,可以看出验证码已被正常识别出来了(如图 3-2 所示)。
在这里插入图片描述

(图 3-2 验证码值)

写在最后

首先,衷心感谢你坚持阅读至此。或许在你看来,这篇文章的内容并不复杂,甚至觉得不过如此。但无论你信不信,上述提供的代码背后,是我耗费了大量精力、历经诸多曲折、不断尝试与修正的成果。在无数次的测试与修改中,我删除了大量代码,经历了无数次的失败。最终,在灵光一闪的瞬间,我才得出了这几行简洁而有效的代码。这个过程虽然充满挑战,但也让我深刻体会到了编程的魅力与乐趣。希望我的分享能对你有所启发,也期待你在编程的道路上不断探索与成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unet改进10:在不同位置添加CPCA||通道先验卷积注意力机制

本文内容:在不同位置添加CPCA注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 低对比度和显著的器官形状变化等特征经常出现在医学图像中。现有注意机制的自适应能力普遍不足,限制了医学影像分割性能的提高。本文提出了一种有效的通道先验卷积…

储能电池热失控监测系统的研发难点是什么?

​ ​​储能电池热失控监测系统的研发难点主要包括以下几个方面: ​ ​1.准确的早期预警 ​ ​在热失控发生的早期阶段,电池的温度、电压、电流等特征参数变化可能非常缓慢,通过传统的监测方法难以及早地监测到电池故障。而此时电池…

使用C++,仿照string类,实现myString

类由结构体演化而来,只需要将struct改成关键字class,就定义了一个类 C中类和结构体的区别:默认的权限不同,结构体中默认权限为public,类中默认权限为private 默认的继承方式不同,结构体的默认继承方式为p…

LLM的发展简述

文章目录 1. NLP的发展简史2. LLM 的进展3. 参考 1. NLP的发展简史 信息理论的创立:20世纪50年代,Claude Shannon 奠定了信息理论的基础,引入了熵和冗余等概念,对 NLP 和计算语言学产生了深远影响。 形式语法的发展:…

代码随想录(day8)—环形链表

题目 预备知识点: for和while的区别 while语句属于循环语句,在判断是,如果条件为true,则会继续判断,直到false为止,即会进行多次判断(除非一开始条件就是错的)。 if语句属于条件判…

炫光HUD杂散光测试方法及设备

HUD杂散光测试概述 HUD(Heads-Up Display)抬头显示器是现代汽车中的一项先进技术,它可以将重要信息如速度、导航等投射在驾驶员的视线前方,从而减少低头查看仪表盘的次数,提高行车安全。然而,HUD在实际使用…

数据主权与隐私保护的深入探讨

随着数字化进程的加速,数据已成为当今世界的重要资源。数据主权和隐私保护这两个概念也越来越受到关注。数据主权涉及到国家对数据的控制权和管理权,而隐私保护则关乎个人数据的安全性和隐私权利。两者相互交织,共同塑造了数字时代的法律、经…

PTA - python暑假题集1

目录 7-1 Hello World!7-2 计算摄氏温度7-3 计算物体自由下落的距离7-4 整数四则运算7-5 求整数均值7-6 输出带框文字7-7 整数152的各位数字7-8 计算火车运行时间7-9 计算存款利息7-10 逆序的三位数7-11 重要的话说三遍7-12 后天7-13 I Love GPLT7-14 是不是太胖了7-15 计算指数…

day44——C++对C的扩充

八、C对函数的扩充 8.1 函数重载(overload) 1> 概念 函数重载就是能够实现"一名多用",是实现泛型编程的一种 泛型编程:试图以不变的代码,来实现可变的功能 2> 引入背景 程序员在写函数时&#x…

某系统存在任意文件下载漏洞

穷者,谁不想达,达者,更畏惧穷。为求发达,穷人兢兢业业,辛辛苦苦,农耕其田,工利其器,商务其业,学读其书,人人都在独善其身,可除了那些少数的书生可…

VS2022打包Docker镜像

1. 前置环境 操作系统win10/win11 安装 Docker Desktop 2. 演示项目 https://gitee.com/izory/ZrAdminNetCore .net8 分支为例 3. 添加 docker支持 4. 配置工程文件 在.proj 文件加上 <ContainerRepository>ZrAdminCore</ContainerRepository> <Containe…

【C++ 面试 - 内存管理】每日 3 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

视频压缩工具哪个好?视频压缩工具安利

还在为视频文件过大而烦恼吗&#xff1f;想要快速分享或上传视频却受限于空间或时间&#xff1f; 别担心&#xff0c;今天我来告诉你们&#xff1a;视频压缩成文件怎么弄。 无需复杂操作&#xff0c;轻松几步&#xff0c;就能让你的视频文件瘦身成功&#xff0c;既保留关键内…

深度学习基础—结构化机器学习项目

1.正交化 这是一个老式电视&#xff0c;有一组旋钮可以对画面进行调节&#xff0c;例如高度、宽度、画面梯形角度、画面位置、画面旋转等等&#xff0c;但是如果有一个旋钮&#xff0c;旋转时可以调节上面所有参数&#xff0c;那么就会出现一种情况&#xff1a;当前的画面高度和…

jconsole远程连接

jconsole可以远程连接的前提&#xff08;需要在部署应用时像下面示例这样设置&#xff09;&#xff1a; -Djava.rmi.server.hostname127.0.0.1 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port3214 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.m…

milvus使用milvus migration工具迁移数据

1.前提&#xff1a;这个数据迁移工具是collection 维度的 2.文章内是2.3.1–》2.4.5数据迁移&#xff0c;公司内部需求&#xff0c;各位看官注意哈 官方架构图&#xff1a; 想要迁移的milvus 官方称之为&#xff1a;源source milvus 要迁入的表 目标的milvus 官方称之为&…

JWT结构详解与JWT设置

JWT结构详解与JWT设置 1. 什么是token2. 为什么要使用token3. 什么是JWT4. JWT的格式4.1 header4.2 payload4.3 signature 5. JWT校验流程6. JWT使用案例6.1 token的创建6.2 判断token是否可以刷新6.3 刷新token6.4 token的校验6.5 用户验证流程 1. 什么是token Token是服务端…

Prometheus+Grafana的安装和入门

概念 什么是Prometheus? Prometheus受启发于Google的Brogmon监控系统&#xff08;相似kubernetes是从Brog系统演变而来&#xff09;&#xff0c; 从 2012年开始由google工程师Soundclouds使用Go语言开发的开源监控报警系统和时序列数据库 (TSDB)。&#xff0c;并且与2015年早…

2017年系统架构师案例分析试题一

目录 案例 【题目】 【问题 1】(12 分) 【问题 2】(13 分) 答案 【问题 1】答案 【问题 2】答案 相关推荐 案例 阅读以下关于软件架构评估的叙述&#xff0c;在答题纸上回答问题 1 和问题 2。 【题目】 某单位为了建设健全的公路桥梁养护管理档案&#xff0c;拟开发一套公…

USB PHY—— PHY 基础

芯片厂商开发了一些 USB PHY 芯片&#xff0c;可以把 DP、DM上的差模信号转成共模信号。 USB PHY 负责最底层的信号转换&#xff0c;作用类似于网口的 PHY。 USB 信号传输前&#xff0c;需要通过 PHY 把 USB 控制器的数字信号转成线缆上的模拟信号。USB 控制器和 PHY 之间的总…