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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

 

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

 

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

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

 

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


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

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

于是,怎么告诉程序这个“1”长什么样呢。我们放大一个图片看。
机器学习Python识别图片验证码原理_第6张图片

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

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

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

整个过程就是这样。 

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

 

转载于:https://my.oschina.net/aptx4869/blog/794661

你可能感兴趣的:(机器学习Python识别图片验证码原理)