python验证码识别之灰度处理,二值化,降噪与tesserocr识别的示例分析

  介绍

这篇文章主要介绍python验证码识别之灰度处理,二值化,降噪与tesserocr识别的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

今天先来看看图像类,这类验证码大多是数字,字母的组合,国内也有使用汉字的。在这个基础上增加噪点,干扰线,变形,重叠,不同字体颜色等方法来增加识别难度。

相应的,验证码识别大体可以分为下面几个步骤:

<李>

灰度处理

<李>

增加对比度(可选)

<李>

二值化

<李>

降噪

<李>

倾斜校正分割字符

<李>

建立训练库

<李>

识别

由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果的数据集。

当需要真实环境下需要获取数据时,可以使用结合各个大码平台来建立数据集进行训练。

生成验证码这里我使用Claptcha (本地下载)这个库,当然验证码(本地下载)这个库也是个不错的选择。

为了生成最简单的纯数字,无干扰的验证码,首先需要将claptcha。py的285行_drawLine做一些修改,我直接让这个函数返回没有,然后开始生成验证码:

得到claptcha  import  Claptcha      时间=c  Claptcha (“8069”,“/usr/分享//truetype字体/freefont/FreeMono.ttf")=t, _  c.write (& # 39; 1. png # 39;)

这里需要注意ubuntu的字体路径,也可以在网上下载其他字体使用。生成验证码如下:

 python验证码识别之灰度处理,二值化,降噪与tesserocr识别的示例分析“> <br/> </p> <p>可以看出,验证码有形变。对于这类最简单的验证码,可以直接使用谷歌开源的tesserocr来识别。<br/> </p> <p> <强>首先安装:</强> </p> <pre类= apt-get  install  tesseract-ocr  libtesseract-dev  libleptonica-dev   pip  install  tesserocr

<强>然后开始识别:

得到PIL  import 形象   import  tesserocr      时间=p1  Image.open (& # 39; 1. png # 39;)   tesserocr.image_to_text (p1)      & # 39;8069 \ n \ n # 39;

可以看的出,对于这种简单的验证码,基本什么都不做识别率就已经很高了。有兴趣的小伙伴可以用更多的数据来测试,这里我就不展开了。

接下来,在验证码背景添加噪点来看看:

c =, Claptcha (“8069”,“/usr/分享//truetype字体/freefont/FreeMono.ttf",噪音=0.4)   时间=t, _  c.write (& # 39; 2. png # 39;)

生成验证码如下:

 python验证码识别之灰度处理,二值化,降噪与tesserocr识别的示例分析“> <br/> </p> <p>识别:</p> <pre类= p2 =, Image.open (& # 39; 2. png # 39;)   tesserocr.image_to_text (p2)   & # 39;8069 \ n \ n # 39;

效果还可以。接下来生成一个字母数字组合的:

c2 =, Claptcha (“A4oO0zZ2",“/usr/分享//truetype字体/freefont/FreeMono.ttf")   时间=t, _  c2.write (& # 39; 3. png # 39;)

生成验证码如下:

 python验证码识别之灰度处理,二值化,降噪与tesserocr识别的示例分析

第3个为小写字母啊,第4个为大写字母啊,第5个为数字0,第6个为小写字母z,第7个为大写字母z,最后一个是数字2。人眼已经跪了有木有!但现在一般验证码对大小写是不做严格区分的,看自动识别什么样吧:

p3 =, Image.open (& # 39; 3. png # 39;)   tesserocr.image_to_text (p3)   & # 39;AMOOZW \ n \ n # 39;

人眼都跪的计算机当然也废了。但是,对于一些干扰小,形变不严重的,使用tesserocr还是十分简单方便的,然后将修改的claptcha。py的285行_drawLine还原,看添加干扰线的情况。

 python验证码识别之灰度处理,二值化,降噪与tesserocr识别的示例分析

p4 =, Image.open (& # 39; 4. png # 39;)   tesserocr.image_to_text (p4)   & # 39;& # 39;

加了条干扰线就完全识别不出来了,那么有没有什么办法去除干扰线呢?

虽然图片看上去是黑白的,但还需要进行灰度处理,否则使用load()函数得到的是某个像素点的RGB元组而不是单一值了。处理如下:

python验证码识别之灰度处理,二值化,降噪与tesserocr识别的示例分析