文档章节

机器学习Python识别图片验证码原理

那位先生_
 那位先生_
发布于 2016/11/26 12:13
字数 1509
阅读 3.6K
收藏 4

今天带你们走进一个听起来比较牛逼的领域,机器学习。

 

拿百科的话来说,机器学习(Machine Learning, ML)就是专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能。其涉及范围还是挺广的,包括概率论、统计学、逼近论、凸分析、算法复杂度理论等。比如前段时间打败世界顶级围棋棋手李世石的AlphaGo就是一个很好的例子。

 

对于机器学习的定义,官方的说法是:对于某类任务T和性能度量P,如果一个计算机程序在T上以P衡量的性能随着经验E而自我完善,那么我们称这个计算机程序在从经验E学习。

换成人话举个例子,比如让一个从来没见过大象的盲人摸象(任务T),你要先告诉盲人一些大象的特征,比如它有四只很大的脚,两个尖锐的象牙,还有一个水管一个的鼻孔。然后先带他去大象馆摸个十来二十来个(经验E)。然后盲人就会记住这些大象摸起来是什么感觉,存储这些感觉在自己的大脑里。准备工作做好了,就可以带他去动物园摸大象了,这样你让他摸的大象越多,他在动物园能辨别的概率就越高(性能度量P)。

 

回到我们今天的主题,识别验证码。首先我们要做的就是找到图片验证码的特征并把它告诉给计算机(也就是程序,下面统称为程序)。比如这些
图片
特征有,四个字符,内容包括10个阿拉伯数字和26个英文字母。然后我们都知道,每个图片都是由像素点来组成的,比如我们打开其中一个验证码把它放大一些。
图片 
可以看到其中的一个小正方形就是一个像素点。数一下,长50个像素,高22个像素。然后验证码都是由一些彩色的像素点构成的,于是,问题就很好解决了,我们就可以记下“4e40”这个验证码的彩色像素分布特征并把它告诉给程序,然后程序下次遇到这种特质验证码就知道它所代表的字符是“4e40”了。但是,这样显然是不行的,阿拉伯数字和字母的排列组合基数太大了(1,679,616),出于性能考虑显然不能这样,而且,你也不可能获取到所有的验证码。于是我们只好“曲线救国”了,我们先把图片切割为四份,每份一个字符,这样,识别只包含一个字符的图片就变得很容易了。
图片
你看,这四个字符分布的多整齐,然后记录下每个字符的左上角起始点和右下角终止点以及每个字符之间的间隔,就可以把图片切割成四份了。如果有必要,你也可以把红框外面多余的像素都切割掉。切割代码如下:
图片 


得到的效果如下:
图片 
(额,为什么刚才还是彩色的图片现在都变黑白了呢?这个是为了后面识别算法简单点做的一个图片预处理,就是把所有的彩色变成黑色,非彩色变成白色的一个过程,简称二值化。这个就不多讲了)

那么整个识别验证码过程就变成了:先获取一些验证码,把它们切割成四份,然后把每个字符的特征都告诉程序,这样反复多次,程序就获得了很多经验,知道1长什么样,2长什么样,然后要识别一个新的验证码时,就把这个验证码切割成四份,然后分四次给程序,让它根据之前的经验去识别。(就好比你拿着一个写有数字1的卡片告诉一个小孩说,这是1,然后他下次看见长得类似的就会跟你说这是1了)。

于是,怎么告诉程序这个“1”长什么样呢。我们放大一个图片看。
图片

你看,这是两张验证码里面出现的“1”,长得多像。从像素点的角度来看就是,左图一行有几个黑点,右图也几乎同样有几个黑点。于是我们就可以多获取一些验证码,然后把所有的1都归类起来,然后记录下每个“1”的“每一行有多少个黑点,每一列有多少个黑点”,把这个特征告诉程序,然后程序下次遇到类似的图片特征,就知道,这就是“1”了。你可能会问,会不会数字1和数字2每一行的黑点和每一列的黑点都相同呢,回答是几乎不可能。所以基本不用担心这个。
把各个字符进行归类,1放在一起,2放在一起。
图片
然后生成特征码。
图片

上面就是生成的特征码,一行特征码代表一张图片,最前面的一列就是这个特征码所代表的字符,后面的1:1 2:2 意思就是第一行有1个黑点,第二行有两个黑点。而19:4,20:7就是第一列有4个黑点,第2列有7个黑点。

这样,当下次程序再遇到一个验证码时,先切割,然后获取其中一份的特征码跟自己已经有的特征码进行对比,然后“卧槽,这个特征码好熟悉,好像就是1啊”,然后就达到了识别的目的。

整个过程就是这样。 

代码实现看这里 http://cafebabe.cn/study/2016/11/28/machine-learning/

 

© 著作权归作者所有

那位先生_

那位先生_

粉丝 131
博文 109
码字总数 242433
作品 0
深圳
后端工程师
私信 提问
加载中

评论(0)

Python破解验证码技术,识别率高达百分之八十!

本文将具体介绍如何利用Python的图像处理模块pillow和OCR模块pytesseract来识别上述验证码(数字加字母)。 我们识别上述验证码的算法过程如下: 将原图像进行灰度处理,转化为灰度图像; 获...

妄心xyx
2019/03/09
0
0
Python图像处理之图片验证码识别

  在上一篇博客Python图像处理之图片文字识别(OCR)中我们介绍了在Python中如何利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract软件来识别验证码...

jclian91
2018/06/10
0
0
网站验证码的生成原理、难度控制,及python实现

图片验证码已经广泛的使用在各种反爬虫的场景中,验证码的的生成验证过程对于开发者来说是零成本的,对于用户体验来说可能稍差、但是对于爬虫来说是致命的和高成本的。 下面将介绍使用pytho...

python之战
2019/03/22
0
0
Python视频教程,带你玩转Python深度学习,TensorFlow框架使用教程分享!

课程内容: 该阶段是深度学习的入门课程,主要介绍经典的深度学习框架TensorFlow的使用,IO操作,以及神经网络基础、卷积神经网络的相关知识,并用卷积神经网络原理搭建、设计自己的网络,实...

小小倾听
2019/01/02
194
0
使用python PIL库实现简单验证码的去噪

首先要感谢一下字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的。 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对...

u012067766
2018/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

第六课:《Linux就该这么学》课堂笔记

“工作马马虎虎,只想在兴趣和游戏中寻觅快活,充其量只能获得一时的快感,绝不能尝到从心底涌出的惊喜和快乐,但来自工作的喜悦并不像糖果那样—放进嘴里就甜味十足,而是需要从苦劳与艰辛中...

宣城热点科技
28分钟前
50
0
【Go专家编程】go module校验机制详解

go.sum文件中每行数据格式如下: <module> <version>[/go.mod] <hash> github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid ......

恋恋美食
31分钟前
49
0
CentOS 7中安装 MySQL 出现了 No package mysql-server available. Error: Nothing to do 错误

# CentOS 7 安装 mysql-server 爬坑 ## 发现问题 在centos 6安装 mysql-server是直接使用命令 yum -y install mysql-server ,但是在CentOS 7中出现了 No package mysql-server available. E......

HuaiAnGG
35分钟前
64
0
说说STM32的堆栈与内存

1.概念 这里所说的堆栈,是针对单片机所说的“堆”与“栈”,指的是内存中一片特殊用途的区域。而不是数据结构中的堆栈(虽然其实规则一样)。 这里所说的内存,是指RAM,RAM包括SRAM,DRAM等。...

rainbowcode
42分钟前
71
0
JVM 的内存布局

JVM 中将内存主要分为这五个部分:方法区、堆、虚拟机栈、本地方法栈、程序计数器。 按照线程是否为共享可分为两类: 线程独享:虚拟方法栈、本地方法栈、程序计数器。 线程共享:方法区、堆...

Oaki
44分钟前
36
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部