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

 2023-09-09 阅读 24 评论 0

摘要:1. 爬取验证码图片 from urllib import requestdef download_pics(pic_name):url = 'http://wsbs.zjhz.hrss.gov.cn/captcha.svl'res = request.urlopen(url)get_img = res.read()with open('/Users/luacheng/project/python/image/vcode/%s.jpg'

1. 爬取验证码图片

from urllib import requestdef download_pics(pic_name):url = 'http://wsbs.zjhz.hrss.gov.cn/captcha.svl'res = request.urlopen(url)get_img = res.read()with open('/Users/luacheng/project/python/image/vcode/%s.jpg' % (pic_name), 'wb') as f:f.write(get_img)if __name__ == '__main__':for i in range(100):pic_name = idownload_pics(pic_name)

 

 

 

2. 二值化

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

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

from PIL import Image
import numpydef binarization(im):  # 二值化imgry = im.convert('L')imgry = numpy.array(imgry)  # 将图像转化为数组height, width = imgry.shapef = open('1.txt', 'w')for i in range(height):for j in range(width):gray = imgry[i, j]if gray <= 220:  # 阈值设为220imgry[i, j] = 0else:imgry[i, j] = 1f.write(str(imgry[i,j]))  #输出到txt查看f.write('\n')'''plt.figure('')plt.imshow(imgry, cmap='gray')plt.axis('off')plt.show()'''return imgryif __name__ == '__main__':img = Image.open('/Users/luacheng/project/python/image/vcode/1.jpg')binarization(img)

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

python保存验证码。

 

3 图片分割

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

 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

python 编码? 

 

图片分类

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

python爬虫破解验证码。 

训练模型

  训练模型很简单,因为直接就是使用libsvm库,我们只需要按照数据格式生成一些特征值即可

 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()

 

 

测试模型

python读取短信验证码,用测试数据对模型进行测试

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)

 

 

 

python登录验证码。 

 

 

 

python伪代码。 

 

 

 

验证码识别api,转载于:https://www.cnblogs.com/zcjcsl/p/9369263.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/20887.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息