验证码识别整理

最近兴趣蔓延, 打算对一验证码进行攻破识别,这也是爬虫高阶的课程. 于是乎找了些资料, 这里总结一下.

验证码识别的大杀器是tesseract

tesseract
tesseract指南中文版-link

但是它处理的能力有限, 对于验证码图片咱们必须先走一篇预处理流程后再扔给它. 安装tesseract也就是一行brew的事情

tesseract

预处理常规有哪些呢?

  • 灰度化
  • 二值化
  • 去除干扰线

图片处理库

Pillow (简称PIL)是一个强大的图片处理库, 具体的文档和官方网站可参考
Pillow文档 - Pillow官网 - Pillow_GitHub
安装方法

灰度化

1
2
#example_image = Image.open('/tmp/example.png') #打开一张图片
gray_image = example_image.convert("L")

convert传入model=”L”的时候, 会转换图片的RGB,返回一张灰度的图片

二值化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def binarizing_image(gray_image,threshold):
"""
传入一张灰度图,进行二值化处理
:param gray_image: convert之后的灰度图
:param threshold:二值化阈值, 我对我的目标图片进行不同尝试,发现`180`的时候能拿到比较理想的值
:return: 二值化后的图片
"""
pixel_data = gray_image.load()
w, h = gray_image.size
for y in range(h):
for x in range(w):
if pixel_data[x, y] < threshold:
pixel_data[x, y] = 0
else:
pixel_data[x, y] = 255
return gray_image

以该阈值为分界划分黑白, 查了下拿到的资料, 有设置为127的, 160的, 以哪种为标准呢? 个人觉得是想要的验证码比较清晰的程度就可以了, 这一块你可以多试试, 我尝试在120-180的区间给到的都比较满意.

去除干扰线

这里的方法看到不少,参考简书的作者比较粗暴的方式进行了处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def depoint(binarizing_image):
"""
对于像素值>245的邻域像素,判别为属于背景色,\
如果一个像素上下左右4各像素值有超过2个像素属于背景色,那么该像素就是噪声。
jianshu_link: "http://www.jianshu.com/p/41127bf90ca9"
:param binarizing_image:
:return:
"""
pixdata = binarizing_image.load()
w,h = binarizing_image.size
for y in range(1,h-1):
for x in range(1,w-1):
count = 0
if pixdata[x,y-1] > 245:
count = count + 1
if pixdata[x,y+1] > 245:
count = count + 1
if pixdata[x-1,y] > 245:
count = count + 1
if pixdata[x+1,y] > 245:
count = count + 1
if count > 2:
pixdata[x,y] = 255
return binarizing_image

处理后的图片转文字

图片转文字实际就是文章开头的tesseract , 不过大牛把它集成在pytesser这个库中,我们命令的调用方法如下:

化繁为简,pytesser一行代码告诉你文字中的图片, 当然前提是必须要安装tesseract
用法如下:

1
2
3
4
#图片文件直接转
print pytesser.image_file_to_string('after_revole_image.jpg')
#这是PIL打开后的图片
print pytesser.image_to_string(image)

pytesser-下载链接 - pytesser安装遇到坑?

局限性?

简单的图片,识别率可破50%, 稍微复杂的图片, 基本是挂彩的. 有解决方案吗? 看到AI训练的模式可以较强的处理 . 这是一个方向.

参考文章

http://www.jianshu.com/p/41127bf90ca9
http://aducode.github.io/posts/2014-07-08/python_identification_verification_code.html

© 2020 In 'flight of thought' All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero