此文已由作者杨杰授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全自动程序。验证码的主要目的是强制人机交互来抵御机器自动化攻击,为了确保服务器系统的稳定和用户信息的安全,越来越多的网站采用了验证码技术。图片验证码是目前最常用的一种,本文也主要讨论这种验证码的识别。
最近在一个爬虫项目中遇到了验证码,需要机器自动识别绕过。这些验证码大都分辨率都较低,本身信息量不大。通常被加入一种或多种干扰因素:各种背景干扰,噪声点像素,字体形变和累叠,字符位置随机及个数不定,反色等情况。在网上调研了资料和文献后,分别采用OCR识别和模板库匹配方法对不同类型验证码进行了识别。主要过程可以分解为三个步骤:1.图片清理,2.字符切分,3.字符识别。以下结合工作经验和调研内容讲解一些常用的验证码识别方法和过程。
1.图片清理
图片清理是为接下来的机器学习或模板匹配阶段做准备的,指通过灰度化、二值化、干扰点清理等过程,得到比较干净的图片数据,具体样例见下表。
1.1 彩色去噪
在计算机中使用最多的 RGB色彩空间,分别对应红、绿、蓝三种颜色,通过调配三个分量的比例来组成各种颜色。以最常见的32位颜色为例,一个分量是用8位来表示,最大值是255,灰度图是指组成颜色的三个分量相等。原始彩色图片包含的信息量是最大的,如果验证码图片中有一些利用颜色反差加的干扰点或者线条,最好能在该阶段做初步清理。比较简单的一种处理方法是采用3*3矩阵对图像进行平滑处理,即对每个像素取他所在3*3矩阵所有点的RGB均值,分别作为新的RGB值。稍微做点优化,取3*3矩阵中RGB三维欧式距离最接近均值的点作为新值。
1.2 灰度化
在彩色电视机系统中,通常使用一种叫 YUV 的色彩空间,其中Y表示亮度信号,对于人眼来说,亮度信号(Y)是最敏感的,如果将彩色图像转换为灰度图像,仅仅需要转换并保存亮度信号就可以。从RGB到YUV空间的Y转换有一个很著名的心理学公式:Y = 0.299R + 0.587G + 0.114B。
而实际应用时,将系数缩放1000倍来实现整数运算:Gray = (R*299 + G*587 + B*114 + 500) / 1000 。注意后面那个除法是整数除法,所以需要加上500来实现四舍五入。该公式的另一个简化变种也很流行:Gray = (R*30 + G*59 + B*11 + 50) / 100。更快的算法是采用移位代替除法,所以可以将系数缩放成 2的整数幂,再做右移操作。该整数取7从精度和速度上最合适:Gray = (R*0.299*2^7 + G*0.587*2^7 + B*0.114*2^7)>>7 = (R*38 + G*75 + B*15)>>7
1.3 二值化
为了简化接下来的计算,需