基于SVM的python简单实现验证码识别
验证码识别是一个适合入门机器学习的项目,之前用knn 做过一个很简单的,这次用svm来实现。svm直接用了开源的库libsvm。验证码选的比较简单,代码也写得略乱,大家看看就好。
1. 爬取验证码图片
import urllib
from urllib import request def download_pics(pic_name):
url = 'http://smart.gzeis.edu.cn:8081/Content/AuthCode.aspx'
res = request.urlopen(url)
get_img = res.read() with open( 'D:\python\验证码\%s.jpg'%(pic_name),'wb') as f:
f.write(get_img) if __name__ == '__main__':
for i in range(100):
pic_name = i
download_pics(pic_name)

2. 二值化
接下来要做的工作就是二值化验证码,所谓二值化,就是将每一个像素点用0或1来表示,图像的每个像素点都有rgb三个值,我们首先转化成灰度图,这样每个像素点就只有一个灰度值了。接下来根据自己设定的阈值来确定每个像素点是该为0还是为1。
我的思路是首先将图像转化为array处理,当然完全可以直接图像处理。
def binarization(im): #二值化
imgry = im.convert('L')
imgry = np.array(imgry) #将图像转化为数组
height, width = imgry.shape
#f = open('s.txt','w')
for i in range(height):
for j in range(width):
gray = imgry[i,j]
if gray <= 220: #阈值设为220
imgry[i, j] = 0
else:
imgry[i, j] = 1
#f.write(str(imgry[i,j])) #输出到txt查看
#f.write('\n')
'''
plt.figure('')
plt.imshow(imgry, cmap='gray')
plt.axis('off')
plt.show()
'''
return imgry
在二值化处理之后,处理结果如下所示:

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

3. 去除噪点
在二值化之后,还存在一个问题就是图像之中还有许多黑点,这成为噪点,是干扰项,去除噪点有很多不同的方法,由于我只是一个小菜鸟,所以我就用了最简单的8-邻域去除噪点法。依次检查每个像素点周围8个点的情况,如果黑点少于阈值时,那么就可以认为该点是噪点。其实这样的处理效果是比较差的,只是适用于去除小点,但是对于干扰线条这种可能就没什么作用了。
def noiseReduction(imgry): #去除噪点
global dx, dy
height, width = imgry.shape
for i in range(height):
for j in range(width):
cnt = 0
if imgry[i, j] == 1: #白点不用管
continue
else:
for k in range(8):
x = dx[k] + i
y = dy[k] + j
if x < 0 or x >= height or y < 0 or y >= width:
continue
if imgry[x, y] == 0:
cnt += 1
if cnt < 4: #周围少于4点就算噪点
imgry[i, j] = 1
return imgry
处理之后可以明显的看到黑点基本上都被处理掉了。

4. 图片分割
接下来要做的就是将这四个数字分割开来形成训练集,这个操作并不难。因为这些验证码的位置都是差不多的,如果验证码字符位置比较乱的话就会比较麻烦。。
def cutImg(img): #图像切割
s = 12
w = 40
h = 81
t = 0
cut_img = []
for i in range(4):
pic = img.crop((s + w * i, t, s + w * (i + 1), h))
cut_img.append(pic)
return cut_img

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

6. 训练模型
训练模型很简单,因为直接就是使用libsvm库,我们只需要按照数据格式生成一些特征值即可。在切割完图片并保存之后,我发现我图片的像素值有略微的改变,可能是重新保存了的原因,所有我这里又进行了一次二值化。。。
这里说明依稀libsvm数据格式的要求:
[label] [index:value] [index:value] [index:value].....
每一个数据都是这样的格式,label是标签,[index:value]是数据的特征值,index就是从0开始的编号,value是特征值。
在这里对于每一张图片,我就把特征值设为每行每列的黑点个数了。如第一个特征值就是第一行黑点个数。。。
import os
from PIL import *
from PIL import Image
import numpy as np
from libsvm.python.svmutil import *
from libsvm.python.svm import * address = 'D:\python\验证码-sort\\'
f = open('train.txt', 'w') def get_feature(dir, file):
f.write(dir)
im = Image.open(address + dir +'\\' + file)
imarr = np.array(im)
height, width = imarr.shape
for i in range(height):
for j in range(width):
gray = imarr[i,j]
if gray <= 150:
imarr[i, j] = 0
else:
imarr[i, j] = 255
im = Image.fromarray(imarr)
count = 0
width, height = im.size
for i in range(height):
c = 0
for j in range(width):
if im.getpixel((j, i)) == 0: c += 1
f.write(' %d:%d'%(count, c))
count += 1
for i in range(width):
c = 0
for j in range(height):
if im.getpixel((i, j)) == 0: c += 1
f.write(' %d:%d'%(count, c))
count += 1
f.write('\n') def train_svm_model():
y, x = svm_read_problem('train.txt')
model = svm_train(y, x)
svm_save_model('model_file', model) if __name__ == '__main__':
dirs = os.listdir(address)
for dir in dirs:
files = os.listdir(address + dir)
for file in files:
get_feature(dir, file)
train_svm_model()
7. 测试模型
用测试数据对模型进行测试。
from libsvm.python.svmutil import *
from libsvm.python.svm import *
import image_slove if __name__ == '__main__':
model = svm_load_model('model_file')
yt, xt = svm_read_problem('test.txt')
p_label, p_acc, p_val = svm_predict(yt, xt, model)

还是不错的,毕竟验证码很简单。。。
8. 预测验证码
终于走到最后一步了,得到一张验证码后先按照之前的操作根据该图片生成特征值,这里标签还是需要的,可以随便填一个,反正这个不重要。或许有别的方法,反正我暂时还不知道。
from libsvm.python.svmutil import *
from libsvm.python.svm import *
from PIL import Image
import image_slove if __name__ == '__main__':
'''
在这里处理图片生成特征值
'''
model = svm_load_model('model_file')
yt, xt = svm_read_problem('predict.txt')
p_label, p_acc, p_val = svm_predict(yt, xt, model)
print('该验证码为:', end='')
for label in p_label:
print(int(label), end='')

最后成功的验证出来了。
9. 总结
通过这个实验对于验证码识别流程有了一定的了解,这次也是直接使用了支持向量机,后续需要稍微学习一下。
基于SVM的python简单实现验证码识别的更多相关文章
- Python 代码实现验证码识别
Python 代码实现验证码识别 测试开发社区 1周前 源 / j_hao104 一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… ...
- python 简单图像识别--验证码
python 简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便( ...
- 使用python及工具包进行简单的验证码识别
相信大家利用 Python 写的爬虫应该遇到过要输入验证码的尴尬局面,又或者写了个自动填充表单的小程序,结果就卡在了验证码上. 在ctf中有⼀一些题⽬目,本身有弱验证码识别绕过,那么我们怎么解决呢? ...
- 字符识别Python实现 图片验证码识别
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- Python实现各类验证码识别
项目地址: https://github.com/kerlomz/captcha_trainer 编译版下载地址: https://github.com/kerlomz/captcha_trainer ...
- 使用TensorFlow 来实现一个简单的验证码识别过程
本文我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 1.验 ...
- python简单处理验证码,三分钟,不能再多了
序言 大家好鸭, 又是我小熊猫啦 我们在做采集数据的时候,过快或者访问频繁,或者一访问就给弹出验证码,然后就蚌珠了~今天就给大家来一个简单处理验证码的方法 环境模块 Python和pycharm如果还 ...
- 简单的验证码识别(opecv)
opencv版本: 3.0.0 处理验证码: 纯数字验证码 (颜色不同,有噪音,和带有较多的划痕) 测试时间 : 一天+一晚 效果: 比较挫,可能是由于测试的图片是在太小了的缘故. 原理: 验证码 ...
- Python中机器学习-验证码识别-粗略总结
#验证码识别# 解决办法:将验证码切割成单个字符训练 遇到问题:验证码字符大小不一或重叠 对上述问题的解决:通过CNN(卷积神经网络)直接就是端到端不分割的识别方式 处理验证码:将图片二值化 输入验证 ...
随机推荐
- Linux基础命令---杀死进程pkill
pkill pkill可以给指定的进程发送信息,它可以结束某个执行的进程或者目录登录的用户. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedo ...
- Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确
Linux下几种重启Nginx的方式,找出nginx配置文件路径和测试配置文件是否正确 目录在/etc/ngnix/conf.d下找出nginx配置文件路径和测试配置文件是否正确# /usr/sbin ...
- Linux查看磁盘空间大小命令
Linux查看磁盘空间大小命令df -hldf -hl 查看磁盘剩余空间df -h 查看每个根路径的分区大小du -sh [目录名] 返回该目录的大小du -sm [文件夹] 返回该文件夹总M数du ...
- linux centos 如何设置swap大小?
linux centos 如何设置swap大小? swap的值都是安装系统的时候设置好的,一般设置为内存的两倍大小.使用过程中发现swap值过小只能添加.用free -m 命令查看当前swap大小 使 ...
- 匿名内部类和内部类中的this
package test; public class A extends B { public String toString() { return "A"; } public s ...
- Elasticsearch集群内的原理
一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力.当有节点加入集群中或者从 ...
- python 之xml.etree.ElementTree
Element类型是一种灵活的容器对象,用于在内存中存储结构化数据. [注意]xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全. 每个element对象都具有以下属性: ...
- Python学习路线人工智能线性代数知识点汇总
人工智能和数据分析相关的线性代数知识.比如什么是矢量,什么是矩阵,矩阵的加减乘除.矩阵对角化,三角化,秩,QR法,最小二法.等等 矢量: 高中数学中都学过复数,负数表达式是: a+bi 复数实际上和二 ...
- mac shell终端编辑命令行快捷键——行首,行尾
Ctrl + d 删除一个字符,相当于通常的Delete键(命令行若无所有字符,则相当于exit:处理多行标准输入时也表示eof) Ctrl + h 退格删除一个字符,相当 ...
- Maven项目启动报错:org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter
看网上说法tomcat启动时会把lib目录下的jar包加载进内存,而项目里也有相同的jar包就会导致jar包冲突 解决办法: 把pom依赖里相应的jar包添加<scope>标签 <d ...