基于SVM的python简单实现验证码识别

验证码识别是一个适合入门机器学习的项目,之前用knn 做过一个很简单的,这次用svm来实现。svm直接用了开源的库libsvm。验证码选的比较简单,代码也写得略乱,大家看看就好。

1. 爬取验证码图片

 1 import urllib
 2 from urllib import request
 3
 4
 5 def download_pics(pic_name):
 6     url = ‘http://smart.gzeis.edu.cn:8081/Content/AuthCode.aspx‘
 7     res = request.urlopen(url)
 8     get_img = res.read()
 9
10     with open( ‘D:\python\验证码\%s.jpg‘%(pic_name),‘wb‘) as f:
11         f.write(get_img)
12
13 if __name__ == ‘__main__‘:
14     for i in range(100):
15         pic_name = i
16         download_pics(pic_name)

2. 二值化

接下来要做的工作就是二值化验证码,所谓二值化,就是将每一个像素点用0或1来表示,图像的每个像素点都有rgb三个值,我们首先转化成灰度图,这样每个像素点就只有一个灰度值了。接下来根据自己设定的阈值来确定每个像素点是该为0还是为1。

我的思路是首先将图像转化为array处理,当然完全可以直接图像处理。

 1 def binarization(im):  #二值化
 2     imgry = im.convert(‘L‘)
 3     imgry = np.array(imgry)  #将图像转化为数组
 4     height, width = imgry.shape
 5     #f = open(‘s.txt‘,‘w‘)
 6     for i in range(height):
 7         for j in range(width):
 8             gray = imgry[i,j]
 9             if gray <= 220:  #阈值设为220
10                 imgry[i, j] = 0
11             else:
12                 imgry[i, j] = 1
13             #f.write(str(imgry[i,j]))  #输出到txt查看
14         #f.write(‘\n‘)
15     ‘‘‘
16     plt.figure(‘‘)
17     plt.imshow(imgry, cmap=‘gray‘)
18     plt.axis(‘off‘)
19     plt.show()
20     ‘‘‘
21     return imgry

在二值化处理之后,处理结果如下所示:

                   

在txt的结果如下所示,可以很明显的看到0413:

3. 去除噪点

在二值化之后,还存在一个问题就是图像之中还有许多黑点,这成为噪点,是干扰项,去除噪点有很多不同的方法,由于我只是一个小菜鸟,所以我就用了最简单的8-邻域去除噪点法。依次检查每个像素点周围8个点的情况,如果黑点少于阈值时,那么就可以认为该点是噪点。其实这样的处理效果是比较差的,只是适用于去除小点,但是对于干扰线条这种可能就没什么作用了。

 1 def noiseReduction(imgry):  #去除噪点
 2     global dx, dy
 3     height, width = imgry.shape
 4     for i in range(height):
 5         for j in range(width):
 6             cnt = 0
 7             if imgry[i, j] == 1:  #白点不用管
 8                 continue
 9             else:
10                 for k in range(8):
11                     x = dx[k] + i
12                     y = dy[k] + j
13                     if x < 0 or x >= height or y < 0 or y >= width:
14                         continue
15                     if imgry[x, y] == 0:
16                         cnt += 1
17             if cnt < 4:  #周围少于4点就算噪点
18                 imgry[i, j] = 1
19     return imgry

处理之后可以明显的看到黑点基本上都被处理掉了。

4. 图片分割

接下来要做的就是将这四个数字分割开来形成训练集,这个操作并不难。因为这些验证码的位置都是差不多的,如果验证码字符位置比较乱的话就会比较麻烦。。

 1 def cutImg(img):  #图像切割
 2     s = 12
 3     w = 40
 4     h = 81
 5     t = 0
 6     cut_img = []
 7     for i in range(4):
 8         pic = img.crop((s + w * i, t, s + w * (i + 1), h))
 9         cut_img.append(pic)
10     return cut_img

5. 图片分类

这个步骤的目的就是人为的给训练集打上标签。 将相同的数字放在同一个文件夹下面。

             

6.  训练模型

训练模型很简单,因为直接就是使用libsvm库,我们只需要按照数据格式生成一些特征值即可。在切割完图片并保存之后,我发现我图片的像素值有略微的改变,可能是重新保存了的原因,所有我这里又进行了一次二值化。。。

这里说明依稀libsvm数据格式的要求:

[label]   [index:value]   [index:value]   [index:value].....

每一个数据都是这样的格式,label是标签,[index:value]是数据的特征值,index就是从0开始的编号,value是特征值。

在这里对于每一张图片,我就把特征值设为每行每列的黑点个数了。如第一个特征值就是第一行黑点个数。。。

 1 import os
 2 from PIL import *
 3 from PIL import Image
 4 import numpy as np
 5 from libsvm.python.svmutil import *
 6 from libsvm.python.svm import *
 7
 8
 9 address = ‘D:\python\验证码-sort\\‘
10 f = open(‘train.txt‘, ‘w‘)
11
12 def get_feature(dir, file):
13     f.write(dir)
14     im = Image.open(address + dir +‘\\‘ + file)
15     imarr = np.array(im)
16     height, width = imarr.shape
17     for i in range(height):
18         for j in range(width):
19             gray = imarr[i,j]
20             if gray <= 150:
21                 imarr[i, j] = 0
22             else:
23                 imarr[i, j] = 255
24     im = Image.fromarray(imarr)
25     count = 0
26     width, height = im.size
27     for i in range(height):
28         c = 0
29         for j in range(width):
30             if im.getpixel((j, i)) == 0: c += 1
31         f.write(‘ %d:%d‘%(count, c))
32         count += 1
33     for i in range(width):
34         c = 0
35         for j in range(height):
36             if im.getpixel((i, j)) == 0: c += 1
37         f.write(‘ %d:%d‘%(count, c))
38         count += 1
39     f.write(‘\n‘)
40
41 def train_svm_model():
42     y, x = svm_read_problem(‘train.txt‘)
43     model = svm_train(y, x)
44     svm_save_model(‘model_file‘, model)
45
46 if __name__ == ‘__main__‘:
47     dirs = os.listdir(address)
48     for dir in dirs:
49         files = os.listdir(address + dir)
50         for file in files:
51             get_feature(dir, file)
52     train_svm_model()

7.  测试模型

用测试数据对模型进行测试。

1 from libsvm.python.svmutil import *
2 from libsvm.python.svm import *
3 import image_slove
4
5 if __name__ == ‘__main__‘:
6     model = svm_load_model(‘model_file‘)
7     yt, xt = svm_read_problem(‘test.txt‘)
8     p_label, p_acc, p_val = svm_predict(yt, xt, model)

还是不错的,毕竟验证码很简单。。。

8.  预测验证码

终于走到最后一步了,得到一张验证码后先按照之前的操作根据该图片生成特征值,这里标签还是需要的,可以随便填一个,反正这个不重要。或许有别的方法,反正我暂时还不知道。

 1 from libsvm.python.svmutil import *
 2 from libsvm.python.svm import *
 3 from PIL import Image
 4 import image_slove
 5
 6 if __name__ == ‘__main__‘:
 7     ‘‘‘
 8       在这里处理图片生成特征值
 9     ‘‘‘
10     model = svm_load_model(‘model_file‘)
11     yt, xt = svm_read_problem(‘predict.txt‘)
12     p_label, p_acc, p_val = svm_predict(yt, xt, model)
13     print(‘该验证码为:‘, end=‘‘)
14     for label in p_label:
15         print(int(label), end=‘‘)

最后成功的验证出来了。

9.  总结

通过这个实验对于验证码识别流程有了一定的了解,这次也是直接使用了支持向量机,后续需要稍微学习一下。

原文地址:https://www.cnblogs.com/zyb993963526/p/8724621.html

时间: 2024-10-10 11:27:27

基于SVM的python简单实现验证码识别的相关文章

Python 代码实现验证码识别

Python 代码实现验证码识别 测试开发社区  1周前 源 /  j_hao104 一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.

python 简单图像识别--验证码

python  简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便(https://files.cnblogs.com/files/Oran9e/PILwin64.zip)(https://files.cnblogs.com/files/Oran9e/PILwin32.zip) 安装 image:pip install image 安装 pytesseract:pi

python 简单图像识别--验证码Ⅲ

python  简单图像识别--验证码Ⅲ 实现自动登陆网站 登录学校图书馆管理系统为例,做一个简单的例子.python识别简单的没有干扰的纯数字验证码还是可以的,但是识别字母数字再加上干扰因素,误报率很高,因此这个我是采用"人工识别",人工输入. 首先得明白cookie的作用,cookie是某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据.因此我们需要用Cookielib模块来保持网站的cookie. 登录学校图书馆管理系统登陆(http://122.207

【验证码】使用Tesseract实现简单的验证码识别

1.Tesseract介绍: Tesseract的OCR引擎最先由HP实验室于 1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一.然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封. 数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技 术研究所获得,并求诸于Google对Tesseract进行改进.消除Bug.优化工作. 2.下载 Tesseract: http

简单的验证码识别

https://blog.csdn.net/qq_35923581/article/details/79487579 这是我尝试写的第一篇技术博客,借鉴了很多博客和教程,写出了自己的代码,代码较为冗杂而且程序十分耗时.所以本文主要提供验证码识别的一个简单的思路,代码实现的部分还望各位大佬指点. 看了好几篇验证码图片识别的博文,不难归纳出验证码识别的大概思路是收集训练集-->图像处理-->得到图片特征值-->训练-->识别,其中图像处理部分又包括了灰度化.二值化.去噪.分割等过程.本

使用TensorFlow 来实现一个简单的验证码识别过程

本文我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 1.验证码准备 这里我们使用 python 的 captcha 库来生成即可,这个库默认是没有安装的,所以这里我们需要先安装这个库,另外我们还需要安装 pillow 库 安装好之后,我们就可以用如下代码来生成一个简单的图形验证码 可以看到图中的文字正是我们所定义的内容,这样我们就可以得到一张图片和其对应的

基于SVM与人工神经网络的车牌识别系统

最近研究了支持向量机(Support Vector Machine,SVM)和人工神经网络(Artifical Neural Network,ANN)等模式识别理论,结合OpenCV的书:<Mastering OpenCV with Practical Computer Vision Projects>,将两种思想运用到车辆的车牌识别算法中.车辆识别结合了多种图像处理技术,如视频监控.图像检测.图像分割和光学字符识别(OCR)等,在道路交通监控中有着重要的作用.以下内容主要包含几个方面: 车牌

Python 自动化之验证码识别

之前公司的验证码比较简单,可以采取直接破解的方式进行登录 部分代码如下: # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Selectimport unittest,ti

自动化测试——利用pytesser进行简单的验证码识别

在测试过程中,经常会遇到验证码的问题,如果是类似如下图所示的简单验证码,可以考虑通过pytesser对其进行自动识别. 示例代码: from pytesser import *import ImageGrabimport os...    os.chdir('C:\Python27\Lib\site-packages\pytesser')    # 先对验证码区域截图,再进行图像识别    screenshot = (1025,600,1025+113,600+47)    image = Im