【人工智能】图像识别之小白天书——验证码篇(1)

本文介绍了图像识别领域应用到验证码**中的第一课,以一种极简的,学习成本极低的方式,带你初识AI,初识图像识别。


如果您对图像识别类的内容或者课程感兴趣,敬请关注我们的订阅号


介绍


图像识别,顾名思义就是指利用计算机对图像进行理解和分析的技术。图像识别技术又是当下最热的人工智能科学(AI)的眼睛,其重要性自然不言而喻!本系列文章定义为是一套由浅入深的文章,验证码识别只是一个引子,后面会继续介绍到身份证、银行卡、各种证件、凭证、票据的识别,不排除更高级的可以用于自动驾驶等领域的技术。独乐乐不如众乐乐,很高兴能作为一个知识的搬运工,把团队的一些小成果,用浅显易懂的话讲出来,和大家一起分享,一起成长!本文献给那些在象牙塔外望而却步的 “小白”们,希望通过本文的学习可以轻松的跨过图像识别的门槛。


语言&环境


开发语言会选用当前不失流行又很简单易学的Python语言。环境这一块儿我会尽量在入门阶段绕过那些重量级并且安装极其繁琐的框架,用轻量的最简单有效的框架来解决问题。主要就是避免那种环境死活都装不上(Caffe,TensorFlow),然后想要学习图像识别的计划夭折的情况……

 

PILPython Imaging Library,很好理解,是python用于处理图像的类库,功能齐全,安装简便,只需要用你的pip install一下,就装上啦!没有pip或者不会用的同学直接去下载:http://www.pythonware.com/products/pil/。


Numpy一个用python实现的科学计算包,我们主要用到它提供的一个强大的N维数组(Array)和一些矩阵运算功能。https://github.com/numpy/numpy这是git地址,下载一个zip包直接解压缩然后setup就可以了,也很是简单! 


验证的方法,进入python直接import一下,如果没有异常,那就说明安装成功了!如图1:                                                 

【人工智能】图像识别之小白天书——验证码篇(1)

图1

好,有这两个就足够了!我们马上起飞!


图像处理


下面我们就正式的对图片进行识别!市面上绝大部分正常的验证码的识别都分为三部曲:去噪、分割、识别。走起第一步,去噪~


第一步:去噪

去噪就是把验证码中的无用的干扰项去掉的一个过程,先看看这些调皮的小验证码,我们为什么要对验证码进行去噪。

【人工智能】图像识别之小白天书——验证码篇(1)

图2

看看这一张一张的小验证码时而如揉搓过的纸屑时而像烂土豆一样,还有的上面有各种神秘的曲线……真是让人感叹设计者的用心良苦!不过上面这些都是比较温柔的了,看看这个大神码:                                             

【人工智能】图像识别之小白天书——验证码篇(1)

图3

像是几个藏在柴火垛里面的牛犊子QAQ……先让我冷静一下。

众所周知,图片都是由三原色组成的,也就是R(red),G(green),B(blue)(下图左),每一个像素点都会有3个值,为这个像素点的RGB值,通过这三个数值从0到255的变化,来组成世间所有的颜色!


大部分的验证码为了人眼识别起来更加清晰,背景颜色及噪声会略浅于验证码的主体颜色,(见图2)这些文字还是很清晰的,因为噪声不会像图3一样确实的干扰到主体。所以我们可以采用一个临界值,来区分某一个像素是验证码的主体还是噪声。这时候,我们需要用到灰度图。

【人工智能】图像识别之小白天书——验证码篇(1)

图4

灰度图就是会把某个像素点的RGB三色转换成一个值,也就是图4右边这个灰阶中的某个点,网上这种转换公式有很多,我们这里直接采用PIL提供的方法,直接读取图片的灰度数据:

from PIL import Image
from numpy import * 

img = array(Image.open('E:\\test.jpg').convert('L'))


代码非常好理解,使用PIL打开一个图片,转换成L模式,即灰度模式 (PIL支持1,L,P,RGB,RGBA,CMYK,YCbCr,I,F共9种模式),并且转换成array对象。这个时候图片就会由左边变成右边的样子:                                     

【人工智能】图像识别之小白天书——验证码篇(1)

图5

这时图片中每个像素点的信息就从之前的RGB三个信息变成了一个信息,即0~255(0是黑色,255是白色)的灰度值。我们可以较好的分别出,哪部分是噪声,哪部分是有效信息。对比图4的灰度图,我们从左2/5的地方作为临界点,也就是认为灰度值小于100是有效信息 (只针对本验证码,不同的验证吗有不同的去噪阀值),大于100都是噪声,全部置为白色:

from PIL import Image
from numpy import * 

img = array(Image.open('E:\\test.jpg').convert('L').point(lambda x:255 if x >100 else 0))



把之前的代码略微修改一下,后面加一个point方法即为对每个像素点的操作,参数传入lambda表达式,把大于100的都置为255,小于100的都置为0,这个方法就是俗称的二值化方法,使图片黑白分明,就会得到下面这个图片:

【人工智能】图像识别之小白天书——验证码篇(1)

 图6

看,所有噪声都去的干干净净啦!图片上只留下了我们需要的信息!至此,去噪工作也算是完成了!把这张图片保存在一个目录中,作为我们下一步处理的图片就好了。代码如下:

Image.fromarray(img).save('E:\\test_clean.jpg')


至此,我们的验证码处理进程也过半了,先下课休息一下!敬请关注后续发布的文章!

(未完待续…) 

【人工智能】图像识别之小白天书——验证码篇(1)

【人工智能】图像识别之小白天书——验证码篇(1)

微信扫一扫
关注该公众号