如何用python实现简单的验证码识别功能

由于前些日子在做爬虫,期间遇到了各种反爬技术,比如cookies验证,验证码验证等等。cookies验证的话,没有加密还好说,加过密的cookies实在是搞不了,以楼主的技术只是勉强能知道对方是用什么加密算法,解密就更不用提了。对于验证码验证来说,网上确实有很多验证码识别的实现以及教程。楼主这里主要串一下这一段过程,遇到的比较恶心的问题,以及解决办法。那么废话不多说,进入正题。

楼主进行验证试验的网站正是楼主本市(曲阜市)自来水厂的网站,这个网站的验证码看上去比较简单,对于刚刚接触图像识别,尤其是起初的验证码识别的人来说,算是完美的入门实验网站了。它的验证码画风都是这个样纸滴~

嗯就是这样人眼识别没有任何难度的验证码,不像有些验证码人眼都看不出来,简直是丧心病狂。

不过就算是这样,在识别过程中也出了一些问题。我们先过一遍流程,再详细说明这些问题。

实验流程如下:

1、爬虫循环爬取验证码二十张到三十张,并以文件形式保存在本地。

2、通过格式工厂,将图片洗成tif或tiff格式。(只更改文件扩展名无效,这是格式编码的问题,必须用格式工厂去洗。)

3、通过jTessBoxEditor工具,生成图像集。

4、在生成的图像集路径下,使用cmd命令

tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox

生成box文件,这也就是后面python进行图像识别的训练库。

5、在jTessBoxEditor下,打开图像集,审查匹配内容,并作人工修改。

主要流程如上,接下来对每一步进行详述。

1、爬虫爬取图片的实现比较简单,我们使用python就可以轻松实现。

import requests
import random
url = 'http://www.qfzls.com/onlinepay/Login.aspx?om=yssf'  # 地址格式定义
imgurl = 'http://www.qfzls.com/onlinepay/yz.aspx'
filename = ''
for j in range(1, 9):
   m = str(random.randrange(0, 10))
   filename = filename + m
filename = 'D:\\image\\'+filename+'.bmp'  # 存成bmp格式
file = open(filename, 'ab')
r = requests.get(imgurl)
file.write(r.content)
file.close()

此处注意,此处一定要存成bmp格式。如果存成jpg格式,图片会变脏而难以识别。这也是起初楼主的识别率一直上不去的主要原因。

当然,楼主还对图片进行了一些处理,以提高识别率。代码如下:

 
  
from PIL import Image
from PIL import ImageEnhance
image = Image.open(filename)  # filename为验证码的路径加文件名,若是放在项目里可以直接使用文件名调用
enh_bri = ImageEnhance.Brightness(image)  # 亮度增强
brightness = 1.5
image = enh_bri.enhance(brightness)

enh_col = ImageEnhance.Color(image)  # 色度增强
color = 1.5
image = enh_col.enhance(color)

enh_con = ImageEnhance.Contrast(image)  # 对比度增强
contrast = 1.5
image = enh_con.enhance(contrast)

enh_sha = ImageEnhance.Sharpness(image)  # 锐度增强
sharpness = 3.0
image = enh_sha.enhance(sharpness)

image.save(filename)
image.show()  #展示效果

此处需要安装一下pillow(PIL)包,使用pip工具即可。

最后,我们使用pytesseract来识别图像。

import pytesseract
print(pytesseract.image_to_string(image))
当然,这样做的识别率通常不到百分之五十。图像处理后不做训练的话,识别率大概有百分之八十。经过训练库训练后,识别率能达到九十五左右。最后,我考虑问题可能出在算法上,因为我发现图像笔画间隔有的地方只有一个像素。于是我们把图像像素扩充了一倍,识别率终于达到了百分之百。下面的操作都是如何利用Tesseract-OCR构造训练库。

2、因为使用jTessBoxEditor制作图像集,只支持tif或tiff格式,所以我们必须通过格式工厂洗一下图片格式。这一步就不多说了吧,基本操作。楼主使用的版本还是4.3.0稍微早点的版本,此处对软件版本没有要求。

洗完格式的图片放在一个单独的文件夹里,方便进行后续操作。

第3、4、5步的话,可以详细看一下大佬写的博客

Tesseract-OCR的简单使用与训练

链接地址:https://www.cnblogs.com/cnlian/p/5765871.html

这三步需要注意的问题在里面都说得非常详细。

最后的审查训练库内容需要人工去做,二三十张工作量不大,效果也很好。


你可能感兴趣的:(python,pillow,验证码识别,Tesseract-OCR,图像识别)