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

介绍

Hello大家好~上一篇的功夫学的怎么样了?学会之后有没有找几个老幼病残的验证码练练手啊^^?啊哈哈!我们的目标就是天下无码!(窥码的朋友别笑了!是验证码的码,不是马赛克的马,你这腰都直不起来了…得注意身体啊!)So~这篇文章我们又回到验证码这个主题上。毕竟是我们《小白码》系列的终章了,老师教育过我们写文章结尾要点题!正某人会很“自然”的创造一些在破解验证码中遇到的场景,和大家分析一下,来寻找解决问题的思路!算是给诸位抛砖引玉。

注:如果下文中用到的验证码不小心和谁家的网站验证相似或吻合,纯属巧合,敬请原谅!


垂直投影

话不多说,直奔主题。现有一验证码,如下:             

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

图1 验证码

正中间有两条明显的线啊!我们第一反应肯定是对图片进行去噪。我们把图片二值化后,将接近于黑色(小于100)的像素点都置为白色,其他区间的颜色保持不变。这时候图片变成了这样:

【人工智能】图像识别之小白天书——验证码篇(5)_第2张图片

图2 去噪后的验证码

这时你发现什么问题没?对啊!图片从中间断开了!这时如果还用我们之前的感染分割算法就会得到不完整的,甚至是完全不一样的字符。M被削掉了犄角,就会变成三个字母:IVI…还有一个掐头去尾的4!有什么办法呢?你愿意写一套修补字符的算法吗?一大堆根据上下左右的判断,最后还有可能把e和4中间的镂空涂成实心的…掩面哭吧~

这时候必须祭出我们的大杀器:垂直投影分割法!

我们的垂直投影法大概的意思就是对每一个竖列的有效像素点进行统计,把图片这个二维的矩阵变成一个一维的数组,数组中的数据就是每一列的像素点的总和,也就是这一列的高度。来一段计算垂直投影的代码:

【人工智能】图像识别之小白天书——验证码篇(5)_第3张图片

图3 计算图片的垂直投影

观察一下得到的数组projection_list,里面的数据是这样的:

【人工智能】图像识别之小白天书——验证码篇(5)_第4张图片

图4 投影数组里面的数据(选截)

为了能更直观的观察到高度的变化,我们借助matplotlib绘制垂直投影后数组的统计图:

【人工智能】图像识别之小白天书——验证码篇(5)_第5张图片

图5 垂直投影后的高度统计图

仔细观察图5,我们会发现四座明显的山峰,中间接近0 的地方就是切分的地方,是不是很直观?结合图4,可以清晰地看出每个字符的横坐标,4个字符的开始、结束横坐标分别是(17,61),(67,128)(138,180),(188,231)。通过代码去判断的话,只要找到连贯的高度大于某个阀值的几个区间就可以。通过这4个坐标组,我们可以把4个字符切出来,切成条条,如下图:

【人工智能】图像识别之小白天书——验证码篇(5)_第6张图片

图6 通过纵坐标切出字符

是不是有的同学又有疑问了?对,这个图还不是最终的成品。怎么能在这个竖条条上把我们想要的信息切出来呢?哈哈再用一次水平投影就好啦!相当于把刚刚做的垂直投影侧过来,很简单吧?就能把我们想要的信息完整的保存下来了。1.jpg那个e的上面虽然有干扰,但是投影之后高度不连贯只能持续10几个像素点之后就断开了,这里注意些好判断,就不会造成困扰。

框字法

上述第二步可以用水平投影完全是因为噪声区域比较小,投影后不连贯。那如果我们的验证码是这个美丽的样子呢?

【人工智能】图像识别之小白天书——验证码篇(5)_第7张图片

图7 干扰较多的验证码

阿西吧,刚学会一招就被破功了…

投影后噪声连绵不断,高低起伏会对我们判断字符造边界成一定的影响,此时投影的方法就瑕瑜互见了!想用投影解决,起码再多好几十行不优雅的判断代码!是时候祭出我们第二件大杀器了!那就是框字法!名字听起来这么高端(我起的),怎么用呢?

顾名思义,框字法就是拿一个小框框,在图片上滑动,当这个框里面的所有像素满足了一定的条件,就切出框里的数据作为样本。

我们这张验证码左右已经没有余量了,我们只需要垂直方向一维的滑动就够足了。条件则是框里面深色像素点最多的那一张,就是我们要的样本。这个条件也是根据很多验证码的噪声都会比本体信息细的特点推算出来的。我们用前面那张最恶心的e来做例子,看下代码:

【人工智能】图像识别之小白天书——验证码篇(5)_第8张图片

图8 框字法代码

通过图8这段代码可以得到一个frame_dict,里面的k,v分别是步数的index和每一步的框里有多少深色像素点,我把这个dict的内容展示给你看:

【人工智能】图像识别之小白天书——验证码篇(5)_第9张图片

图9 frame_dict内容

为了更直观的查看结果,我特意把每走一步框到的部分生成一张图片展示给大家看:

【人工智能】图像识别之小白天书——验证码篇(5)_第10张图片

图10 每一步生成的图片

这图片直观的展示了我们的框的运行轨迹,对应图9我们发现像素最多的是18,1659个黑色像素点,也就是18.jpg,看下图10,还真是第18张最准确呢!怎么样!厉害吧!只需要对dict排个序就可以把字体的坐标确定出来啦!

切出最小的字符之后,别忘了做像素二值化,图片大小归一化,才能用于识别!这里只是展示一下切割的思路,其他步骤省略。好了,就先说到这里吧。


终,待续

到这里要正式的给我们《小白码》系列文章画一个休止符了。十分感谢大家这一个多月来的陪伴,也真心希望我的文章能对大家的工作、学习起到丝丝的推动作用,那也不辜负我脱落的头发、磨出茧的手指和变大的屁股…(音乐停!!)行了,不渲染气氛了,既然只是休止符,正某人这里有一个好消息和一个好消息要告诉大家,你们想先听哪个?

1,图像识别系列文章稍后将推出进阶版!其中包括了图片识别和证件识别!让你和证件拍照上传,图片的自动分类处理等等技术来个亲密接触!(作者是比我还正经的一位仁兄,江湖人称东莞华少)

2,正某人将稍作整顿,之后重磅推出第二个长篇系列:《AI之自然语言处理》,届时欢迎大家指导拍砖!

各位,江山不改,绿水长流,日后我们江湖再见!

 

【人工智能】图像识别之小白天书——验证码篇(5)_第11张图片


【人工智能】图像识别之小白天书——验证码篇(5)_第12张图片

微信扫一扫
关注该公众号

你可能感兴趣的:(人工智能)