您的位置:首页 > 编程语言 > Python开发

python+svmlib+opencv实现图片验证码的自动识别

2017-09-17 18:09 351 查看
识别原理关键基于机器学习

以下是余下全文

python配置opencv网址

python配置SVMLIB网址

一、思想(基本步骤)

1.获取训练样本(python“爬”取)

2.图片预处理(去噪声)

3.图片分割(分割为单个数字)

4.提取特征(每行黑色像素点构成的向量的协方差)

5.训练(基于svmlib)

6.识别(基于svmlib)

二、获取训练样本

图片验证码是来源于“湖南大学迎新系统”



url='http://yxxt.hnu.cn/VerifyCode.aspx?????'
f = open("./picture/"+str(i)+".png","wb")
f.write(urllib2.urlopen(url).read())
f.close()


代码分析:上述url是网站中获取验证码路径,并且将获取的图片保存到本地



三、图片预处理(去噪声)

通过观察训练样本,发现噪声点的RGB都大于等于195

for i in range(image_output.shape[0]):
for j in range(image_output.shape[1]):
if(image_output[i][j][0]>=195 and image_output[i][j][1]>=195 and image_output[i][j][2]>=195):
image_output[i][j]=(255,255,255)


代码分析:由于从上一步获取的图片都是白色作为背景色,因此将噪声点全部设置为白色



四、图片分割(分割为单个数字)

基本思路:首先得分析图像,此样本中的图片的每个数字基本上分布比较均匀,只要确定数字的左右、上下边界,就能将单个数字分割出来

child_img_list = []
for i in range(4):
x1 = 10 + i * 50
x2 = 60 + i * 50
child_img = img[15:100,x1:x2]
child_img_list.append(child_img)
cv2.imwrite(path+str(PictureNum)+str(i)+".png",child_img)


代码分析:通过分析图片,发现图片中每个数字的高度固定在15~100(上边界和下边界)之间,而x1代表数字的左边界,x2代表数字的右边界

五、提取特征(每行黑色像素点构成的向量的协方差)

1.将图片分割成5×5个子区域,每个区域是10×17个像素点

2.计算每个子区域中黑色像素点个数,得到了5×5的矩阵

3.计算第二步得到的矩阵的协方差(协方差代表了每个子区域之间的关联性)

FeatureKeep =[[] for i in xrange(5)]
for i in range(5):
for j in range(5):
black_sum=0
for k in range(10):
for m in range(17):
# 判定黑点
if(input_image[5*i+k,j*5+m] < 200):
black_sum=black_sum+1
FeatureKeep[i].append(black_sum)
#计算协方差
cov_mat = np.cov(FeatureKeep,rowvar=0)


代码分析:FeatureKeep保存了每个子区域的总的黑色像素点个数,cov_mat保存了协方差

六、训练(基于svmlib)

y, x = svm_read_problem("./data/train.txt")
model = svm_train(y, x)
svm_save_model("./model", model)


代码分析:(详情见参考网址中的svmlib for python详解)

1.“train.tx”有特定格式:label index1:value1 index2:value2 …

2.y代表样本的标签(数字0类、数字1类),x代表了样本的特征

3.svm_train训练得到一个模型

4.svm_save_model保存训练模型

七、识别(基于svmlib)

yt, xt = svm_read_problem(“./testPicture/recognize.txt”)
model = svm_load_model("./model")
p_label, p_acc, p_val = svm_predict(yt, xt, model)  # p_label即为识别的结果


代码分析:(详情见参考网址中的svmlib for python详解)

1.recognize.txt中是和训练中的train.txt相同格式的

2.yt代表了识别图片的编号,就是代表第几张图片。xt代表识别图片的特征

3.svm_load_model加载训练模型

4.svm_predict识别,p_label中存放的是识别的结果,会返回识别的标签(数字0或者数字1…)

八、参考网址

python实现验证码识别

svmlib for python详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 机器学习