某头条点选验证码识别

现在的验证码越来越千奇百怪了,深度学习框架越来越多,也越来越人性化,这就导致了很多不知道原理的人一样可以通过框架训练出自己的模型来识别字符验证码。而且一般字符验证码如果有足够的数据集就很容易就被识别出来,模型结构都可以不怎么变化,所以现在一些网站的验证码都不再是简单的字符验证码了。就比如某某网站的验证码:

首先,肯定想到的是用OCR来识别这整张图,实测发现基本没有一个第三方OCR工具可以准确的提出这三个字。还是只能使用常规的方法来解决。思来想去,大概思路也就只有先把图片中的文字扣出来,然后做进一步的处理,所以这种验证码的识别最关键的也就在于怎么把文字从整张图中完整的扣出来。开始的想到的方法是先指定一个可以包含文字大小的框,比如50x50.然后将图片从左上角开始截取这样一个框大小的图片,接着向右平移一个像素点在截取一张图片,直到操作完整张图。实践发现这个方法并不可行,首先截出来图片数量巨大,处理起来很费时间,而且就算截出来一个完整的字,用OCR也是不能百分百识别图片,甚至说识别率很低。后面灵机一动想到了一个比较不错的方法,这里卖个关子,先看看扣出来的文字是什么效果:

第一张第二张第三张效果是不是还可以。其实到了这一步,已经算解决了验证码了。后面操作就很简单了,有两种思路:一是直接使用通用的OCR来识别出所有的文字,然后找出和需要点击的文字相同的文字。不过文字有一定程度的倾斜,需要做些处理,否则OCR大概率会识别不出来。处理也很简单,既然你向左倾斜了某个角度,那么我将图片向右倾斜某个角度不就摆正了。另外,虽然无法判断文字向那边倾斜了,但是可以大概估计(眼测法)文字倾斜的角度有四种: 30,45,-30, -45,只要将提取出来的文字向这几个方向分别倾斜一遍,用OCR依次把这些倾斜后的图片都识别一遍,只要有一张图可以识别出需要点击的字就说明这个字就是我们需要的。

还有一种思路则是我不关系图片中是什么字,我只关心提出来的文字和上面需要点选的文字这两张图片是不是长的像,只要算法认为这两张图片长的挺像,就可以认定这两张图片代表的是用一个文字。如何计算图片的长得像呢?直接计算两张图片的距离就行,通常使用的是欧式距离,相离最近的两张图片就认为它们是最相似的。这两种思路的代码我就不写了,OCR可以使用一些AI开放平台的API,也可以使用第三方python库,计算两张图片的欧氏距离也比较简单。

说回正题,如何高效的提取验证码中的文字?首先,肯定是要先观察文字有什么特征,也就是和背景有什么区别,才能把文字和背景分离,要想效果好,这个特征必须很明显。而从图片中可以很明显的看出每个文字的颜色都是一样的,能不能直接通过颜色提取到文字呢?不太可能,因为背景中同样包含文字的颜色,而且事先也不知道文字是什么颜色的。怎么可以区分出背景的颜色和文字的颜色,怎么能在不知道文字什么颜色的情况下将它分离出来?

请使用浏览器的分享功能分享到微信等