登入验证码的识别

放在前面

  • 无深度学习
  • 无机器学习

在以前的博客中,教务系统一键查询成绩我在登入这一步,使用的腾讯文字识别的api虽然说免费用3000次,但总觉得受限于人,今天捣鼓了一天,终于用自己的方法实现了验证码识别,虽然很简陋,但是终归是实现了,哈哈.

在这里插入图片描述

在昨天刚了解完支持向量机,当时就想到了用支持向量机来分类图片.昨天睡觉的时候就激动的不行,想要实现,心痒痒的.然后今天一早起来就开始折腾了.现在实现了,不过没用支持向量机,用的最简单的方法…

首先分析一下识别的步骤叭:

  1. 降噪.
  2. 二值化/灰度化图片方便处理
  3. 切割验证码
  4. 训练
  5. 预测

这是,一开始的设想,后面有些不同,写完再总结一下.

首先降噪,其实这个验证码的降噪还算容易处理的,肉眼就可以看到干扰线只有一种颜色.将这个颜色转成背景色就好.当然这样子会导致字母有些地方缺失颜色了.所以如果线太粗遮住的地方太多就没办法了.

第二次补充,第一次写的时候都忘了当初的改进了.干扰线并不全是直接用背景色代替,而是遍历以这个点为中心的九宫格,红色多的话久换红色,背景色多就换背景色

这是在ps中的放大图.

在这里插入图片描述
降噪后
在这里插入图片描述
然后因为图片是彩色的,RGB三通道颜色,比较难处理,那就转化一下,理论上应该灰度和二值都可以,这里使用的是灰度.(一开始想用的二值化,后面还是用了灰度化,如果中间看到我代码把灰度化叫成了二值化,不要混乱.参数搞错了)

在这里插入图片描述

然后就是分割,分割这一步,我是这么分割的,搜索有值点的列数(不全是空白的列数),然后如果中间有空列,那就以空白列隔开.
比如,搜索到的列数是(6,7,8,9,10,12,13,14,15)那么6-10就是一个字母,12-15的一个字母.
当然有缺陷…这个应该还是可以有改善的方法的,暂时没想出来…
在这里插入图片描述
分割后的数据
在这里插入图片描述
就到了训练这一步…然后我发现,训练个锤子…都没标签,我自己一个一个打不得累死.除了这点以外…这些分割的图片的大小都不一样,不知道能不能用于训练(我想到的解决方法是填充0,让大家都变成同样大小,这个理论上应该是可以解决的?)主要就是训练标签没法解决,然后我就放弃了,用支持向量机试了试mnist训练集(早上的文章)

不过当然没有完全放弃,不然也就没这个博客了.主要舍不得前面的工作白白浪费.慢慢的想到了最简单的方法.

分析:这个验证码大小字体完全是一模一样的,来来去去也就那么多,那我只要把所有的都分割出来,然后识别的时候,只要对比大小,大小相同,对比像素点的值,对比出来最像的就是那个值了…虽然很朴素,但是对付这个简单验证码,我觉得完全ok.

在这里插入图片描述
标准码的矩阵,可以看出来是个Z
在这里插入图片描述

然后我爬了300来张验证码.找到上面的标准码(我称为).爬了300次都没碰到Oo0Ili1jJ我觉得这几个是不是人为设置了出现频率低,因为人眼也难识别这几个玩意儿(比如说,第四第五个,哪个是i的大写,哪个是L的小写)

最后,对于一张新的预测码通过以下步骤进行识别:

  1. 除噪
  2. 灰度化
  3. 分割
  4. 对比标准码
  5. 输出结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以看到效果还是不错的,只要不碰到粘连的情况,以及干扰线遮住了字母的上或者下线

可改进之处:
1.粘连,可以想想怎么分开
2.字母的下线其实都是同一个地方,可以改成固定值,能避免干扰线遮住下线的情况

识别代码

import numpy as np
import os
from PIL import Image#对照标准码
def duibi(X, img_size, x_):max_du = 0index = -1for i in range(len(img_size)):x_length = img_size[i][0]x_width = img_size[i][1]x_array = np.array(x_)if x_.size == img_size[i]:temp = 0for j in range(x_width):for k in range(x_length):if x_array[j][k] == X[i][1][j][k]:temp += 1if temp > max_du:max_du = tempindex = X[i][0]return index#除噪+灰度化
def chuzao(img):color=[(255,0,0),(211,211,211)]#红色和背景色的rgb值width = img.size[0]  #宽度height = img.size[1]  #高度for i in range(0, width):  # 遍历所有长度的点for j in range(0, height):  # 遍历所有宽度的点data = (img.getpixel((i, j)))  # 打印该图片的所有点# print (data)#打印每个像素点的颜色RGBA的值(r,g,b,alpha)# print (data[0])#打印RGBA的r值if (data[0] == 105 and data[1] == 105 and data[2] == 105):count = [0, 0]for t in range(3):for q in range(3):if(i+t-1 >= 0 and j+q-1 >= 0 and i+t-1 < width and j+q-1 < height):temp = img.getpixel((i+t-1, j+q-1))if(temp[0] == 255):count[0] += 1else:count[1] += 1img.putpixel((i, j), color[count.index(max(count))])# img.save(path, 'png')img = img.convert('L')return img#分割图像,返回分割的列表.
def fenge(img):res = []x1 = set()x2 = []width = img.size[0]  height = img.size[1]  for i in range(width):for j in range(height):data = img.getpixel((i, j))if(data == 76):x1.add(i)x1 = list(x1)# print(x1)# print([i for i in range(len(x1))])flag = 0for i in range(len(x1)):if(flag != 0):flag -= 1continuefor j in range(i, len(x1)):if j == len(x1) - 1:x2.append([x1[i], x1[j]])flag = len(x1)breakif(x1[j]-x1[i] != j-i):x2.append([x1[i], x1[j-1]])flag = j-i-1break# print(x2)# temp = img.crop((x2[0][0],0,x2[0][1],0))for i in range(len(x2)):temp = img.crop((x2[i][0]-1, 0, x2[i][1]+1, height))ytemp = set()for j in range(temp.size[1]):for k in range(temp.size[0]):if temp.getpixel((k, j)) == 76:ytemp.add(j)breakytemp = list(ytemp)yreal = []yreal.append(ytemp[0])yreal.append(ytemp[-1])temp = temp.crop((0, yreal[0]-1, temp.size[0], yreal[1]+1))# temp.save('{}.png'.format(str(i).rjust(4, '0')), 'png')res.append(temp)return resif __name__ == "__main__":inpath = r'C:\Users\83599\Desktop\自动化操作代码\数据分类2'paths = os.listdir(inpath)img_size = []X = []for path in paths:img = Image.open(os.path.join(inpath, path))X.append([path[0], np.array(img)])img_size.append(img.size)# x_ = Image.open('C:\\Users\\83599\\Desktop\\自动化操作代码\\fenge\\0001.png')# print(img_size)# print(x_.size)# print(duibi(X, img_size, x_))img = Image.open('C:\\Users\\83599\\Desktop\\自动化操作代码\\data\\082.png')img = chuzao(img)img = fenge(img)for i in range(len(img)):print(duibi(X, img_size, img[i]))

爬取验证码的代码

说明几点

  • 没用之前的screenshot因为…截图的分辨率很低很低…如果用那个,可能图像处理要多几步,好像叫锐化?
  • 抄了win32api的用法,其实就是右键保存图片,没别的方法保存图片了…有点难受的…具体的搜索selenium右键保存就好
import selenium
from selenium import webdriver
import pickle
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import requests
import timeimport win32api
import win32con
VK_CODE ={'enter':0x0D, 'down_arrow':0x28}
#键盘键按下
def keyDown(keyName):win32api.keybd_event(VK_CODE[keyName], 0, 0, 0)
#键盘键抬起
def keyUp(keyName):win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0)driver = webdriver.Chrome()
driver.get("")  # 地址栏里输入网址
driver.implicitly_wait(2)  # 设置隐式等待时间driver.find_element_by_id('user_login').send_keys("")#账号
driver.find_element_by_id('user_password').send_keys('')#密码
driver.find_element_by_name('commit').click()for i in range(1):driver.get("")  # 地址栏里输入网址img = driver.find_element_by_xpath('//*[@id="Table16"]/tbody/tr[9]/td[3]/img')ActionChains(driver).context_click(img).perform()#右键,点击 win32api.keybd_event(86, 0, 0, 0)win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)time.sleep(1)#按enter# input()keyDown("enter")keyUp("enter")time.sleep(1)

感慨:

  • 今天可以算是征服了这个验证码hh,之前一直觉得这么简单的验证码用深度学习的api有点耻辱.今天用简单暴力的方法解决了,有点爽.
  • 不得不说深度学习的api强的…screenshot这么糊的图片都能识别,而且图片还很小…

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kaptcha 验证码技术的应用

一.背景 图形验证码的生成与使用&#xff08;防止机器恶意攻击&#xff09; 二.代码&#xff08;使用&#xff09; 1.添加Maven依赖 <!--验证码 --> <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId&…

王田苗对话四位AI领军人物:具身智能的机遇与挑战

一个新的机器人时代已经开启&#xff0c;几位顶级AI、机器人大佬&#xff0c;如何思考具身智能&#xff1f;大模型给机器人带来了怎样的变革意义&#xff1f;人形机器人多久能进入家庭&#xff1f; 从早稻田大学1972年研发的WABOT&#xff0c;到特斯拉2022年首秀的Optimus&…

玖章算术CEO叶正盛在数据技术嘉年华分享NineData AIGC的应用实践

4月8日下午&#xff0c;为期两天的第十二届数据技术嘉年华&#xff08;DTC 2023&#xff09;在北京新云南皇冠假日酒店圆满落下帷幕。大会得到了工业和信息化部电子五所的支持和指导&#xff0c;围绕“开源融合数字化——引领数据技术发展&#xff0c;释放数据要素价值”这一主…

软件技术基础知识忏悔录C#.NET篇(一)

为何开始 人已是大三之年&#xff0c;虽是身在985&#xff0c;心里却没有半分985的底气&#xff0c;自从大二分流以来&#xff0c;自己几乎是没再系统的学过什么&#xff0c;除了几位知识还算渊博的老师教了较为详细的数据库、数据结构的知识之外&#xff0c;其他老师大抵都是迷…

聊聊简历怎么写

大家好&#xff0c;我是柠檬哥。 年初看机会、准备换工作的同学比较多&#xff0c;后台也有很多同学请教如何准备面试&#xff0c;精力有限&#xff0c;一个个回复肯定是回不过来。 关于求职面试这块的的话题有点大&#xff0c;大部分人内心OS估计是&#xff1a; 忍了一年的SX领…

程序员该如何去写自己的简历-代码而成的简历

首先&#xff0c;声明这是写给程序员看的&#xff0c;而不是码农。其次&#xff0c;如果你不幸是码农那么请成为程序员。最后&#xff0c;码农和程序员是有区别的&#xff0c;程序员应该是有思想的手工艺人&#xff0c;在这个机械高度生产化的世界里&#xff0c;人口众多的手工…

【总结】1637- 如何利用 ChatGPT 提升 JavaScript 编程能力?

最新文章&#xff1a; 【工具】1636- 高效办公&#xff01;5款腾讯免费AI工具 【工具】1634- 提高工作效率&#xff0c;这 10 款 AI 工具不能错过&#xff01; 【分享】1632- 推荐 20 款顶级 AI 聊天机器人&#xff0c;轻松畅聊未来 最近几天&#xff0c;GPT-4、ChatGPT Plugin…

可以用什么软件画流程图?看看这几款画流程图软件

我们在日常的学习和工作中&#xff0c;经常会需要制作一些流程图来帮助我们梳理工作的流程或知识点&#xff0c;帮助我们能够更好地理清思路&#xff0c;让我们可以更加顺利地完成学习和工作任务。那大家知道在线画流程图工具有哪些吗&#xff1f;还不知道的小伙伴&#xff0c;…

绘制交互流程图的方法

转载自&#xff1a;http://blog.sina.com.cn/s/blog_6b6abdc10100wpny.html 下面介绍一个设计方法&#xff0c;这是一个用于兼顾“为流程”与“为结构”的信息架构&#xff08;IA&#xff09;的设计方法。是2010年底&#xff0c;我和seven共同分析总结出来的。在广州的“2010年…

分别画出程序的软件流程图、NS图、PAD图; 程序

1、分别画出程序的软件流程图、NS图、PAD图&#xff1b; 程序 #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) {int Edge_a,Edge_b,Edge_c;printf("Input three int type data between space:\n");scanf("%d %d %d"…

分享一个开源的流程图绘制软件--Diagram Designer

最近在写专利文件&#xff0c;在制作说明书附图时想到自己还只会用wps进行简单的绘制&#xff0c;于是想学习下&#xff0c;填补下这方面的短板。这两天查到了DiagramDesigner这个小工具&#xff0c;派上了大用场。用它写完了一个发明专利&#xff0c;还给zigbee产品设计了一个…

交互流程图用什么软件做?

产品经理在进行产品设计等工作时&#xff0c;会使用交互流程图来提高团队效率。这种流程图适用于传达方案、评审目标等需要团队协作的场景&#xff0c;视觉设计师、产品开发等工作团队只需看图便能迅速理解图示要义&#xff0c;极大地节省了理解时间&#xff0c;有效提高沟通效…

给菜鸟看的Android应用开发全流程

给菜鸟看的Android应用开发全流程——好多Android开发中&#xff0c;没人告诉过你的事 很多菜鸟开始学习Android开发&#xff0c;去网上搜集过很多“Android开发教程”&#xff0c;但是搜索出来的东西&#xff0c;如果不是特别针对性的关键词&#xff0c;基本上内容都是&#x…

对话钉钉音视频专家冯津伟:大模型不是万能的

策划&#xff1a;LiveVideoStack 在音视频技术领域&#xff0c;ICASSP 大会是行业的风向标会议&#xff0c;也是语音学界从业者研究下一代技术发展的盛宴。近期&#xff0c;国内外各大企业陆陆续续放出论文入顶会的消息&#xff0c;钉钉蜂鸣鸟音频实验室 2 篇论文也登上了 ICAS…

ChatGPT颠覆者来了!Auto-GPT强在哪?

ChatGPT自诞生以来&#xff0c;一直备受关注&#xff0c;人们感受到了人工智能的强大。 现在&#xff0c;一个更加强大的人工智能应用已经登场——Auto-GPT。 Auto-GPT的一大突破是&#xff0c;可以让AI自我提示&#xff0c;就是说&#xff0c;这个AI完全不需要咱们人类了。 什…

每日一皮:每天到公司 VS 工作一小时后

往期推荐 每日一皮&#xff1a;都 0202 年了&#xff0c;我怎么可能被骗呢&#xff1f; 每日一皮&#xff1a;用户“这个项目很容易嘛”&#xff5e; 每日一皮&#xff1a;客户期望 vs 最终产品 每日一皮&#xff1a;入职新公司第一周的感受... 每日一皮&#xff1a;小公司搞中…

XXXX直聘聊天机器人

XXXX直聘聊天机器人 想转岗到爬虫工程师&#xff0c;由于面试机会太少&#xff0c;而boss直聘又无法海投&#xff0c;决定做一个boss直聘机器人来帮我找工作。 一、基本需求 一个爬虫程序爬取需要的工作信息&#xff0c;存入数据库。 聊天机器人每天上午10点向未聊天的boss打…

每天加班的HR,时间都浪费在了这些琐事上?

编者按&#xff1a;随着无纸化办公的引入&#xff0c;为企业办公免去了非常多的成本浪费&#xff0c;那么OA系统是如何为无纸化办公助力的呢&#xff1f;让我们一起往下看。 HR每天的工作离不开招聘、员工入转调离信息、出勤排班、薪酬和工资单、绩效福利、培训、休假管理等等。…

一位程序员的一天工作清单:5:30下班,5:30起床

分享职场程序员生活、职场攻略、领导同事相处技巧和创业资源 文|洪生鹏 曾发布了一篇《一位程序员的一天清单》文章&#xff0c;简单描述了一位程序员了的一天日程安排。 文章发布后&#xff0c;得到了广大读者的欢迎&#xff0c;其中读者们的留言最为精彩了&#xff0c;比文章…

工作日志day01

1.No matching distribution found for virtualenv 查询了好多资料&#xff0c;最终找到问题所在&#xff1a; 2.根据上述果然报错ping: www.baidu.com: Temporary failure in name resolution 解决&#xff1a; 最终成功下载虚拟环境 3.cuda编程问题&#xff1a;根据代码运行环…