识别原理关键基于机器学习
以下是余下全文
python配置opencv网址
python配置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代表数字的右边界
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保存了协方差
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保存训练模型
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详解