好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

字符型验证码识别

字符型验证码

1. 什么是验证码

在开发爬虫的过程中会遇到一种常见的反爬措施,验证码。验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。

2. pillow

Python传统的图像处理库 PIL (Python Imaging Library ),可以说基本上是Python处理图像的标准库,功能强大,使用简单。

官方文档:https://pillow.readthedocs.io/en/latest/installation.html

Pillow 的安装比较的简单,直接pip安装即可:

 pip?install?Pillow  

由于是继承自 PIL 的分支,所以 Pillow 的导入是这样的:

 import?PIL? #?或者 from?PIL?import?Image  
3.常用属性

PIL.Image.filename

图像源文件的文件名或者路径,只有使用 open() 方法创建的对象有这个属性。

类型:字符串

PIL.Image.format

图像源文件的文件格式。

PIL.Image.mode

图像的模式,一般来说是“1”, “L”, “RGB”, 或者“CMYK” 。

PIL.Image.size

图像的大小

PIL.Image.width

图像的宽度

PIL.Image.height

图像的高度

PIL.Image.info

图像的一些信息,为字典格式

字符串验证码的处理

这是code.png

4.1 灰度化

一张图片由很多像素点构成,一个像素点的颜色是由RGB三个值来表现的 R=G=B 这个值就叫做灰度值 ?白色255 黑色0

R * 0.3 +G * 0.59 + B * 0.11

 from?PIL?import?Image image?=?Image.open('code.png') im?=?image.convert('L') im.show()  

效果如下

4.2 二值化

先灰度在二值化

利用一个阈值来判断一个图像的像素点是0还是255,小于阈值像素点就变为0,大于阈值像素点编程255

常用阈值选择的方法是:

灰度平局值法:取127 (0~255的中数, (0+255)/2 = 127)

平均值法:

计算像素点矩阵中的所有像素点的灰度值的平均值avg

 from?PIL?import?Image def?binazing(image): ????''' ????对图片进行灰度和二值化 ????:param?image: ????:return: ????''' ????image?=?image.convert('L') ????#?增强对比度 ????image?=?image.point(lambda?x:?1.2?*?x) ????w,h?=?image.size ????#?print(w,h) ????###?二值化 ????pixdata?=?image.load() ????for?i?in?range(h): ????????for?j?in?range(w):  ????????????if?pixdata[j,i]?>?170: ????????????????pixdata[j,i]?=?255 ????????????else: ????????????????pixdata[j,?i]?=?0 ????return?image if?__name__?==?'__main__': ????image?=?Image.open('code.png') ????image?=?binazing(image) ????image.show()  

效果如下

4.3 降噪

经过了二值化处理,整个图片像素就被分为了两个值0和255, 如果一个像素点是图片或者干扰因素的一部分,那么她的灰度值一定是0(黑色),如果一个点是背景,其灰度值应该是255,白色

所以对于孤立的噪点,他的周围应该都是白色,或者大多数点都是白色的,所以在判断的时候条件应该放宽,一个点是黑色并且相邻的点为白色的点的个数大于一个固定的值,那么这个点就是噪点。

说白了就是一个黑点周围都是白色的就是噪点

 def?depoint(image): ????''' ????对图片进行降噪 ????:param?image: ????:return: ????''' ????pixdata?=?image.load() ????w,h?=?image.size ????for?y?in?range(1,h-1): ????????for?x?in?range(1,w-1): ????????????count?=?0?#?用来判断是否达到噪点的要求 ????????????#?一个点的八个方向,就是3X3矩阵中,噪点是5的位置 ????????????#?245是可以变的值,但最好不要是250以上 ????????????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?pixdata[x-1,?y?-?1]?>?245: ????????????????count?=?count?+?1 ????????????if?pixdata[x+1,?y?+?1]?>?245: ????????????????count?=?count?+?1 ????????????if?pixdata[x?-?1,?y+1]?>?245: ????????????????count?=?count?+?1 ????????????if?pixdata[x?+?1,?y-1]?>?245: ????????????????count?=?count?+?1 ????????????if?count>4: ????????????????pixdata[x,y]?=255 ????return?image  

效果如下

识别

下面是用比较古老的 pytesser3 识别验证码

github地址:https://github测试数据/tesseract-ocr/tesseract/wiki

下载地址:https://github测试数据/UB-Mannheim/tesseract/wiki

注意记得添加环境变量

新建TESSDATA_PREFIX 环境变量

cmd下可以运行tesseract

安装

 pip?install?pytesseract?  

只需要就可以了

 pytesseract.image_to_string(image)  

最终识别出来了,TBQ还有一个L没有识别出来,这是我调了很多次的对比度最好的结果

6. 反思

对于需要准确度高的识别,需要使用百度的api,而不是使用传统的方法。

一直原创,从未转载

请认准我, 将我置标

转发,好看支持一下,感谢

查看更多关于字符型验证码识别的详细内容...

  阅读:31次