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

识别原理关键基于机器学习

以下是余下全文

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详解

你可能感兴趣的:(机器学习)