概要:在爬虫中我们时常会碰见登录时候需要识别验证码的问题, 当然,验证码有很多,本篇文章只说最普通的图片验证码。
1、首先需要下载OCR
OCR,光学字符识别,作用是通过扫描图片,将其转换为文本。
百度下载即可。
2、我们需要安装tesserocr、PIL
pip3 install tesserocr 如果安装出错可以去:https://github.com/simonflueckiger/tesserocr-windows_build/releases?from=文章页内链接下载wheel文件。
PIL图片处理库,就不多说了。
3、识别
3.1、首先随便去网站找几个验证码
3.2、识别测试
- open()方法打开图片
- show()方法弹出图片
- image_to_text()将图片中的字符提取出来。
结果:
我们可以看到结果不是很准确,我们可以试试做一些其他的处理。
3.3、处理验证码
一、灰度化处理
用convert()传入L进行灰度化处理
二、二值化处理
在此之前需要了解像素值,用0-255表示,0表示的是黑,255表示的白。
pixdata = image.load()方法是获取到图片的像素,通过pixdata[x,y]来获取某一个点的像素值。
w,h = image.size 获取图片的宽度和高度。
通过for循环来遍历图片上的像素点,因为在此之前我们已经将图片灰度化处理,现在的图片非黑即白,因此我们定义一个阈值(threshold=150,你需要根据自己的图片更改不同的值),当图片大于这个值,可以理解为靠近白色,即是用来干扰我们的视线的,所以我们把这些像素直接修改成255(白色),反之小于该阈值,我们把他修改成0(黑色)。
三、降噪
邻域像素算法:
判断一个点的上下左右四个点的像素值,如果有3个或以上的点的像素值大于245,可以认为是干扰我们视线的点,我们便将该像素点变为白色。
因此,我们将代码修改为:
import tesserocr from PIL import Image image=Image.open('code.jpg') #将图片进行灰度化 image=image.convert('L') #读取像素值 pixdata = image.load() #获取到图片的宽度和高度 w,h = image.size #设置一个阈值 threshold=150 #遍历循环该图的像素点,判断 for y in range(1,h-1): for x in range(1,w-1): if pixdata[x,y] < threshold: pixdata[x,y] = 0 if pixdata[x,y] >= threshold: pixdata[x,y] = 255 count = 0 if pixdata[x,y-1] > 245: count =1 if pixdata[x,y 1] > 245: count =1 if pixdata[x-1,y] > 245: count =1 if pixdata[x 1,y] > 245: count =1 if count > 2: pixdata[x,y] = 255 image.show() result=tesserocr.image_to_text(image) print(result)
结果图:
4、降噪其实还有很多方法,你也可以试图写出自己判断的方式。
这个验证码识别的效率比较低,我们不追求100%的成功,我们需要了解的这个思路。
有兴趣的可以自己训练自己的字体库,来提高我们的识别效率。
5、完。