字符型验证码
1. 什么是验证码在开发爬虫的过程中会遇到一种常见的反爬措施,验证码。验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
2. pillowPython传统的图像处理库 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 Image3.常用属性
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.com/tesseract-ocr/tesseract/wiki
下载地址:https://github.com/UB-Mannheim/tesseract/wiki
注意记得添加环境变量
新建TESSDATA_PREFIX 环境变量
cmd下可以运行tesseract
安装
pip install pytesseract
只需要就可以了
pytesseract.image_to_string(image)
最终识别出来了,TBQ还有一个L没有识别出来,这是我调了很多次的对比度最好的结果
6. 反思
对于需要准确度高的识别,需要使用百度的api,而不是使用传统的方法。
一直原创,从未转载
请认准我, 将我置标
转发,好看支持一下,感谢