Python 机器学习 识别验证码 来个'沃贝'自动签到(1: 图像处理)
off999 2024-10-29 14:57 21 浏览 0 评论
前言叨B叨
我不知道有多少同学知道沃贝,用联通的同学也不见得都知道, 因为我也是后来别人科普给我才知道联通旗下有这么个网站, 每天签到,一个月到头可以得950M流量. 对于我这种14块月租套餐的用户来说,还是很不错的福利. 但是, 问题来了, 每天签到, 很烦躁的说, 于是就想着做个自动签到, 顺便以 python 机器学习 的名义, 废话路上说, 来不及了, 快上车!
如下图所示, 验证码识别一般分为如下几个步骤, 今天我们主要说下红框部分, 图像采集和处理.
一. 采集图像
先去到网站上的登录窗口, 找到二维码的地址, 然后写个循环把图片下载下来做样本, 多多益善,我这只下了50张.
在截图中可以看到, 这个验证码还不是个一般的验证码, 是个二般的. 特征为: 纯数字, 字体有旋转, 背景有杂色, 还有干扰线. 所有这些特征, 除了纯数字以外, 全部是来阻止程序自动识别的绊脚石. 接下来, 我们就来一步一步地扫清障碍, 还我4个清纯的数字s.
二.图像处理
处理图像之前, 先把pillow装上:
pip install pillow
2. 首先来灰度化,二值化, 就是把背景杂色过滤掉变得非黑即白.这里的阈值设置的是170, 可根据不同的验证码设置不同的值.
然后图像会变成这样:
3. 接下来去噪. 这个去噪不比ps里, 用橡皮擦擦就没了, 里面还是有些门道(算法)的. 比如[邻域像素算法]:
即对于像素值>245的邻域像素,判别为属于背景色,如果一个像素上下左右4各像素值有超过2个像素属于背景色,那么该像素就是噪声。这里还需要考虑到边界问题.
去噪后, 效果如下图. 对于以上邻域算法仅仅是针对像素为1的干扰线, 对于像素大于一的干扰线没做处理. 不过这个对于机器学习的话问题不大, 因为我们最后生成的样本会有很多种类, 然后让程序去推测当前识别的对象的可信度.
4. 接下来应该是切割验证码(开始那个流程图感觉不太对, 应该是先分割后再校正倾斜度)
切割验证码用的是投影算法, 即坐标从上到下, 从左到右遍历, 如果发现是空白,就跳过,直到扫描到像素值为255的点,开始输出, 输出到纵坐标上没有像素值为255的点,如下图所示:
相关代码呢, 太长了, 贴上来估计你也不愿意看. 我在后面把所有代码上传到GitHub(地址附在文章底部), 大家有兴趣就down下来研究研究.
5. 校正倾斜度, 然后重新调整大小. 校正倾斜度这里用的是旋转卡壳算法, 如下图所示, 当两条平行线之间的举例最短的时候, 就认为是字符正确的方向.
代码如下:
这里在旋转的时候是从-60度到60度, 是依据当前验证码倾斜规律设定的. 调整完后效果如图. 可以发现有些字符并不是很正, 但是将就吧
其实如果是用机器学习的去识别字符的话, 校正倾斜度可做可不做, 因为机器学习是靠大量样本来对比识别的, 如果你的歪歪扭扭的样本足够多, 一样可以识别.
6. 归一化. 把以上的几个步骤写到一个循环里, 跑他个N遍, 这时候, 我们就有了好多好多的数字图片, 这时苦力活来了...我们需要将每张数字图片归类, 在本地创建0-9十个文件夹, 将数字图片按显示值放入相应的文件夹里.
其实这里在我们校正倾斜度的时候可以先使用tesseract先识别一下数字, 然后将其存放在相应文件夹里, 这样可以减轻一部分工作量, 但是有时候识别的不准确,或者是无法识别, 所以还得我们手工去检查一下.
pip install pytessearct
Pytessearct说明:
a、Python-tesseract是一个基于google's Tesseract-OCR的独立封装包;
b、Python-tesseract功能是识别图片文件中文字,并作为返回参数返回识别结果;
c、Python-tesseract默认支持tiff、bmp格式图片,只有在安装PIL之后,才能支持jpeg、gif、png等其他图片格式;
使用如下python 语句识别字符后,存入对应文件夹
recNum = pytesseract.image_to_string(cur_img,config='-psm 10 outputbase digits')
最后整理完揍是这个样子
结语
至此, 识别验证码的第一部分港完了, 得到了一堆小小的数字图片.
后面将会进一步讲讲验证码识别部分. 敬请期待.
说好的GitHub链接
https://github.com/shark526/WowSign
参考链接:
抱歉此处用了截图, 因为太多链接会被和谐,文章都发布不了
相关推荐
- Modbus RTU 指令基本功能介绍(modbus-rtu)
-
ModbusRTU协议概述:入门级知识点ModbusRTU协议,是工业自动化领域应用广泛的串行通信协议。它简单、可靠,在各种工业设备之间建立通信桥梁,实现数据的采集和控制。ModbusRTU...
- AIOT开发选型:行空板 K10 与 M10 适用场景与选型深度解析
-
前言随着人工智能和物联网技术的飞速发展,越来越多的开发者、学生和爱好者投身于创意项目的构建。在众多的开发板中,行空板K10和M10以其独特的优势脱颖而出。本文旨在为读者提供一份详尽的行空板K...
- 程序员花了1个月时间,手搓低成本机械臂:跟着他你也能复刻一台
-
在开源硬件的广阔天地中,SO-ARM100作为一款备受瞩目的开源机械臂项目脱颖而出。它以标准化的四轴机械臂设计为核心,构建起一个开放共享的技术平台,为机械臂爱好者与开发者提供了绝佳的远程操作实践场域...
- RPC接口测试技术-Tcp 协议的接口测试
-
首先明确Tcp的概念,针对Tcp协议进行接口测试,是指基于Tcp协议的上层协议比如Http,串口,网口,Socket等。这些协议与Http测试方法类似(具体查看接口自动化测试章...
- 同事开玩笑说:你这个python程序要是外流出去了,可能会有危险
-
引言公司因为业务原因,购入了一些高灵敏高精度的振动传感器。老板说:“拿去进行测试,看看数据如何?”吭哧吭哧接入数据,一看,确实精度和灵敏度非常高。具体多高呢?将传感器固定在相关的结构物上,在办公室中人...
- STM32搭建简易环境监测站并通过网络实时上报
-
一、系统总体架构本系统以STM32F407为核心,搭建一个环境监测节点,能够采集温湿度、光照、空气质量等数据,并通过OLED屏显示,同时通过ESP8266模块实现局域网数据上报。适合室内空气监测、智慧...
- STM32通过NB-IoT模块实现远程告警推送
-
一、项目概述本系统以STM32F103C8T6作为主控核心,通过串口控制NB-IoT通信模块(移远BC26),实现对外设状态的远程监测和异常自动告警推送(如温度超限、设备震动异常等)。支持通过UDP或...
- MicroPython 玩转硬件系列3:上电执行程序
-
1.引言上一篇:MicroPython玩转硬件系列2:点灯实验我们在ESP32上实现了LED灯的闪烁,但是有一个问题,该功能的实现需要我们在串口终端里去手动执行代码,可不可以让ESP32上电后自动...
- 打标机与上位机通讯异常如何快速定位?串口工具验证流程拆解
-
打标机与上位机通信过程中出现的错误问题需要通过串口通信助手验证,主要原因在于串口通信的底层特性以及问题隔离的工程需求。以下是原理说明和验证方法:一、验证原理底层数据透明化串口通信本质上是基于二进制数据...
- 4G短信猫发送中文短信(Python)(4g短信)
-
4G短信猫发送中文短信(Python)4G短信猫发送中文短信的方式可以使用TEXT模式或者PDU模式。1.TEXT模式在TEXT模式下发送中文短信的指令序列:AT+CSCS="UCS2...
- ESP32如何刷microPython固件(esp32 固件升级)
-
目录为什么要刷microPython固件固件和工具的获取刷固件的步骤检验是否成功1.为什么要刷固件microPython是由计算机工程师DamienGeorge设计出来的,他的初衷是——用Pyth...
- CH9329双头线使用说明(双头线是干什么用的)
-
目录1.介绍说明2.测试说明3.修改为ASCII模式(CH9328字符模式)常见问题解答:1.介绍说明CH9329双头线是集成了CH9329+CH340芯片的成品线,主要作用是使用主控电脑发送串口指令...
- Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译
-
前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...
- CPU眼里的:Python 和 C(cpp和python)
-
“Python跟C语言有什么联系?它们在计算机系统中分别扮演着什么角色?”01提出问题Python可能是当今最热门的编程语言,凭借简洁易读的语法和强大的生态,成为许多新手程序员的首选。然而,作为一门解...
- Python在工控领域的应用与优势(python工业控制系统)
-
前言之前利用Python编写了一些S7系列的PLC调试工具和组态开发,今天就具体讲讲Python在工控领域还有哪些应用与优势。Python在工业控制工控领域的应用逐渐增多,得益于其简洁的语法、丰富的生...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)