Categories
程式開發

两种方式识别“传统”图片验证码


目前,很多网站为了反爬都会采取各种各样的策略,比较简单粗暴的一种做法就是图片验证码,随着爬虫技术与反爬技术的演变,目前验证码也越来越复杂,比较高端的如Google的I‘m not a robot,极验等等。这些新的反爬方式大多都基于用户行为分析用户点击前的鼠标轨迹来判断是访问者是程序还是人。

基于图像处理的图片验证码识别

这篇文章介绍的是破解一般“传统”的图片验证码的步骤。上面提到的极验(目前应用比较广)也已经可以被破解,知乎上有相关的专栏,这里就不重复了。

即便是传统的图片验证码,也是有难度区分的(图一是我母校研究生院官网上的验证码,基本形同虚设;图二则是某网站的会员登录时的验证码增加了一些干扰信息,字符也有所粘连),但是破解的流程大致是一样的。

两种方式识别“传统”图片验证码 1

图1

两种方式识别“传统”图片验证码 2

图2

识别步骤

获取样本

从目标网站获取了5000个验证码图片到本地,作为样本。因为后期需要进行监督学习样本量要足够大。

样本去噪

✎ 先二值化图片

这一步是为了增强图片的对比度,利于后期图片图像处理,代码如下:

# 二值化图片
    @staticmethod
    def two_value_img(img_path, threshold):
        img = Image.open(img_path).convert('L')
        #  setup a converting table with constant threshold
        tables = []
        for i in range(256):
            if i < threshold:
                tables.append(0)
            else:
                tables.append(1)

        # convert to binary image by the table
        bim = img.point(tables, '1')
        return bim

效果如下:

两种方式识别“传统”图片验证码 3

✎ 图片去噪

该案例中就是去除两条干扰线,常规的去噪算法有很多(洪水法等等),这里根据图片的特点采用了两种去噪算法,一种是自己根据图片的特征实现的算法,另一种是“八值法”。去噪后的效果如下,可以看到去除了大部分的干扰线(剩下的根据字宽可以直接过滤掉),但是部分字符也变细了,所以这一步的去噪阀值需要不断调整,在去噪的基础上要尽量保持原图的完整和可读性。

原文链接:【https://www.infoq.cn/article/T2KpbMzffRwLFz71OlvM】。未经作者许可,禁止转载。