强智科技验证码识别
前言
由于近期在写一个教务系统的爬虫程序,但是网站的验证码让人很头疼,所以笔者临时找了一些资料学习了一下,本人python用的很少,而且在机器学习这块也是新手,从来没有接触过,所以写的不好还请指点出来。
环境
python3.6
PIL
sklearn
准备
使用一个简单的脚本下载1000张验证码,然后做好标记
import requests
url = "http://****/verifycode.servlet"
for i in range(1000):
filename = "./code/"+str(i)+".png"
response = requests.get(url)
with open(filename , "wb") as f:
f.write(response.content)
图像处理
实例图片
1.二值化,这里我们进行手动利用一个阈值进行二值化,处理完成以后的图片如下
2.降噪,思路是,当一个点他为黑色时,周围8(这个数字改小一点还可以完成线去除干扰线的功能,我这里就是使用这种方式将干扰点和干扰线去除的)个点都是白色则认为这是一个噪点
我们发现还是有一个点没有去除,没有关系,下面我们做字符分割的时候还是会进行一次降噪
3.字符分割,思路是找出每个数字的边缘坐标,如果上下边缘相差太小的话则认为这里为噪点,直接去除
图片转换为数据
上面已经分割好了,我们现在需要将图片转换成数据,方便我们下面传入机器学习,我用的方式是遍历分割好的方形区域,黑色为1,白色为0,拼接成一个类似于“0011010100000101111111111”的字符串,然后将字符串转换成int型数值
最后生成的数据是下面这种样子
图片数据:[“61256415613215646512” , “61256415613215646512” , “61256415613215646512” , “61256415613215646512”]
结果数据:[‘1’ , ‘j’ , ‘k’ , ‘d’]
训练模型
我是用的是knn分类算法
代码
1.图像处理类
from PIL import Image , ImageDraw
import cv2
'''
图片处理类
'''
class ImageHandler():
threshold = 130 #二值化处理阈值
im = None #保存当前类所处理的图片
spliter = []
data = []
labels = []
def __init__(self , filename):
self.filename = filename
self.data = []
self.labels = []
self.spliter = []
self.im = None
'''