前言
简单地研究了一下WHMCS验证码的自动识别方法,采用k近邻算法进行分类识别
环境
Python2.7
使用模块:
pillow, numpy, sklearn
过程
既然要研究验证码,肯定先得获取大量的验证码图片
"""
获取验证码
"""
import requests
import uuid
for i in range(1, 201):
resp = requests.get('http://www.xxxxx.com/includes/verifyimage.php')
with open('whmcs/' + str(uuid.uuid4()) + '.png', 'wb') as f:
f.write(resp.content)
通过循环下载来获取大量的验证码图片
然后就开始我们的研究了
一、转为灰度图
首先,我们利用pillow打开图片。
from PIL import Image
image = Image.open('test.png')
然后把图片转为灰度图
image = image.convert('L')
二、增强色差
将图片转换为numpy数组
import numpy as np
image = np.asarray(image)
print(image.shape)
打印一下图片的长宽
可见图片长100像素,高24像素。
我们需要将灰度图中大于100左右的像素转换为255,也就是把肉眼看上去比较黑的像素转为完全黑。
image = (image > 100) * 255
处理后的图片
三、切割字符
由上图可以看出,此时的干扰已经接近没有了,剩下的部分也不影响我们的识别工作。
def split_letters(image):
letters = [image[:, 23: 33], image[:, 32: 42], image[:, 41: 51], image[:, 50: 60], image[:, 59: 69], image[:, 69: 79]]
return letters
四、构建knn分类器并训练识别
from sklearn.neighbors import KNeighborsClassifier
X, y = load_dataset()
knn = KNeighborsClassifier()
knn.fit(X, y)
完整代码
此处内容需要评论回复后方可阅读
总结
总的来说,对于这种简单的验证码识别的准确率还是蛮高的,经过测试,准确率接近百分之百。
博主厉害,学习一下。、
6666啊
牛逼克拉斯!!!
博主厉害!