这种验证码的识别是最为简单的,规规矩矩。接下来我们就阐述一下识别方法。
使用模块:
pillow, numpy, sklearn
首先,我们利用pillow打开图片。
from PIL import Image
image = Image.open('doc/9381.png')
转为灰度图
image = image.convert('L')
将图片转换为numpy数组
import numpy as np
image = np.asarray(image)
print(image.shape)
打印一下图片的长宽
(20, 60)
可见图片长60像素,高20像素。
我们需要将灰度图中大于135左右的像素转换为255,也就是把肉眼看上去比较黑的像素转为完全黑。
image = (image > 135) * 255
split_parts = [
[7, 16],
[20, 29],
[33, 42],
[46, 55]
]
letters = []
for part in split_parts:
letter = image[7:, part[0]: part[1]]
letters.append(letter.reshape(9*13))
我们将切割后的数字保存下来。每个数字对应6份左右。
装载数据
def load_dataset():
X = []
y = []
for i in range(70):
path = "./train/%d%d.png" % (i / 7, i % 7)
pix = np.asarray(Image.open(path).convert("L"))
X.append(pix.reshape(9*13))
y.append(int(i / 7))
return np.asarray(X), np.asarray(y)
构建分类器并训练
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X, y)
预测数据
knn.predict(letters)
总的来说,对于这种简单的验证码识别的准确率是蛮高的接近百分之百。另外我们可以使用sklean的joblib储存模块将训练的模型存放起来以后使用。