验证码我们在生活中经常碰到 , 如在注册信息的时候 , 在登录的时候 , 在支付的时候等 , 那你知道它是如何进行验证码识别的吗?今天就和大家一起探讨Python验证码识别之利用pytesser识别简单图形验证码 。

文章插图
一、探讨
识别图形验证码可以说是做爬虫的必修课 , 涉及到计算机图形学 , 机器学习 , 机器视觉 , 人工智能等等高深领域……
简单地说 , 计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法 。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成 。计算机涉及到的几何图形处理一般有 2维到n维图形处理 , 边界区分 , 面积计算 , 体积计算 , 扭曲变形校正 。对于颜色则有色彩空间的计算与转换 , 图形上色 , 阴影 , 色差处理等等 。
在破解验证码中需要用到的知识一般是 像素 , 线 , 面等基本2维图形元素的处理和色差分析 。常见工具为:
支持向量机(SVM)
OpenCV
图像处理软件(Photoshop,Gimp…)
Python Image Library
二、PIL安装
PIL: Python Imaging Library, 是Python平台的图像处理标准库 , 功能非常强大 。
在Debian/Ubantu linux下直接通过apt安装:
$sudo apt-get install python-imaging
Max和其他版本的Linux可以直接使用easy_install或pip安装 , 安装前需要把编译环境装好:
$ sudo easy_install PIL
Windos平台可以直接去PIL官网下载exe安装包 。
注:官网提供的安装包是32位的 , 63位系统还需要下载替代包pillow 。
三、一般思路
验证码识别的一般思路为:
1、图片降噪
2、图片切割
3、图像文本输出
3.1 图片降噪
所谓降噪就是把不需要的信息通通去除 , 比如背景 , 干扰线 , 干扰像素等等 , 只剩下需要识别的文字 , 让图片变成2进制点阵最好 。
对于彩色背景的验证码:每个像素都可以放在一个5维的空间里 , 这5个维度分别是 , X,Y,R,G,B , 也就是像素的坐标和颜色 , 在计算机图形学中 , 有很多种色彩空间 , 最常用的比如RGB , 印刷用的CYMK , 还有比较少见的HSL或者HSV , 每种色彩空间的维度都不一样 , 但是可以通过公式互相转换 。在RGB空间中不好区分颜色 , 可以把色彩空间转换为HSV或HSL 。
验证码图片7039.jpg:
文章插图
1、导入Image包 , 打开图片:
【如何利用pytesser识别简单图形验证码?】from%20PIL%20import%20Image
im%20=%20Image.open('7039.jpg')
2、把彩色图像转化为灰度图像 。RBG转化到HSI彩色空间 , 采用I分量:
imgry = im.convert('L')
imgry.show()
灰度看起来是这样的:
文章插图
3、二值化处理
二值化是图像分割的一种常用方法 。在二值化图象的时候把大于某个临界灰度值的像素灰度设为灰度极大值 , 把小于这个值的像素灰度设为灰度极小值 , 从而实现二值化(一般设置为0-1) 。根据阈值选取的不同 , 二值化的算法分为固定阈值和自适应阈值 , 这里选用比较简单的固定阈值 。
把像素点大于阈值的设置,1 , 小于阈值的设置为0 。生成一张查找表 , 再调用point()进行映射 。
threshold%20=%20140
table%20=%20[]
for%20i%20in%20range(256):
if%20i%20<%20threshold:
table.Append(0)
else:
table.append(1)
out%20=%20imgry.point(table,%20'1')
out.show()
处理结果看起来是这样的:
文章插图
3.2%20图片切割
识别验证码的重点和难点就在于能否成功分割字符 , 对于颜色相同又完全粘连的字符 , 比如google的验证码 , 目前是没法做到5%以上的识别率的 。不过google的验证码基本上人类也只有30%的识别率 。本文使用的验证码例子比较容易识别可以不用切割 。
推荐阅读
- 如何使用python将数字转换成大写金额
- 苦丁茶能减肥吗 苦丁茶是如何瘦身的呢
- 如何解决webpack打包文件过大的问题
- 普洱生茶如何泡,新制普洱生茶
- 桔普洱茶怎么泡,普洱茶怎么泡如何泡出清香普洱茶
- 卧室装修瓷砖要如何选择
- 如何挑选舞菇
- 如何挑选筋多的牛腱子
- 如何挑选芝士
- 如何挑选白鸭
