每周一篇20170723验证码识别方法

Posted 机器学习模型与Python入门

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每周一篇20170723验证码识别方法相关的知识,希望对你有一定的参考价值。

【每周一篇20170723】验证码识别方法

欢迎大家投稿~:请加 QQ: 210900259



本文重点讲解Python识别方法,准确率没有达到100%,如果有兴趣,可以看一下多多的VBA识别方法,准确率特别高;

有需要的小伙伴回复 C#003进行获取源文件


【每周一篇20170723】验证码识别方法



下面讲讲Python的识别过程

本次围绕验证码识别方法进行学习;

普通的数字或者字母验证码识别步骤分为以下2步:

1、图片处理;

2、训练并预测;

一、图片处理

假如当你爬取某网站时有如下验证码,你通过爬虫下载了100份样本,当然在实际应用中为了保证准确率远远不止100份,会有更多,今天学习的主要是思路方法;

【每周一篇20170723】验证码识别方法

我们打开其中一张可以看到,每张验证码上有干扰线以及点,那么在分割成每个数字之前,需要将干扰线以及干扰点去除;

【每周一篇20170723】验证码识别方法

大致步骤如下所示:

a. 读取图片

b.图片灰值化处理

c.去干扰线

d.通过规律进行截取;

e.截取每个数字图片并保存为32*32大小的图片

具体代码如下所示:

__Author__ = '随心'
from PIL import Image,ImageEnhance
import os
class image_manage:
def __init__(self,path,d):
self.im=Image.open(path)
self.image=ImageEnhance.Contrast(self.im)
self.im=self.image.enhance(2)
self.im=self.im.convert('1')
self.w,self.h=self.im.size
self.box=(0,0,self.w-2,self.h-2)
self.d=d
def ganraoxian(self):
for i in range(1,self.w-1):
for j in range(1,self.h-1):
up_color=self.im.getpixel((i-1,j))
down_color=self.im.getpixel((i+1,j))
if up_color==255 and down_color==255:
self.im.putpixel((i,j),255)
left_color = self.im.getpixel((i, j-1))
right_color = self.im.getpixel((i, j+1))
if left_color == 255 and right_color == 255:
self.im.putpixel((i, j), 255)
def crop_image(self):
self.im=self.im.crop(self.box)

def cut_image(self,w,h):
list1 = [];i = 0;list2 = [];j = 0;list3 = []
for x in range(1,w - 1):
for y in range(1,h - 1):
data = self.im.getpixel((x, y))
list2.append(data)
if data == 255:
i += 1
if i == 22:
list1.append(x)
break
i = 0
list2 = []
for line in range(len(list1) - 1, 0, -1):
if list1[line] == list1[line - 1] + 1:
list1.remove(list1[line])
for y in range(1, h - 1):
for x in range(1, w - 1):
data1 = self.im.getpixel((x, y))
if data1 == 255:
j += 1
if j == 76:
list3.append(y)
break
j = 0
for line1 in range(len(list3) - 1, 0, -1):
if list3[line1] == list3[line1 - 1] + 1:
list3.remove(list3[line1 - 1])
y_len, y_len1 = list3[0], list3[-1]
train1 = []
for img in range(len(list1) - 1):
self.d += 1
box = (list1[img], y_len, list1[img + 1], y_len1)
self.im.crop(box).resize((32, 32)).save("e:\\image\\testimage\\%s.jpg" % str(self.d))
def main(self):
image_manage.ganraoxian(self)
image_manage.crop_image(self)
w,h=self.im.size
image_manage.cut_image(self,w,h)

通过以上操作会将相应图片截取成如下格式,我们再建立0-9的文件夹并手工将每个数字移动相应文件夹;

【每周一篇20170723】验证码识别方法

二、图片转txt文档

通过第一步我们得到了0-9的几十张32*32的图片,此时可以构建验证码识别的训练集;

通过遍历每个文件夹下的图片,并将图片进行二值化保存为txt文档,文件名为0-9相应数字+下划线数字(该数字可以随意); 

# train1=[]
# for i1 in range(0,10):
# d=0
# image_path="e:\\image\\testimage\\"+str(i1)+"\\"
# image_list=os.listdir(image_path)
# for line in image_list:
# d+=1
# img2 = Image.open(image_path+line)
# image = ImageEnhance.Contrast(img2)
# img2 =image.enhance(2)
# img2 =img2.convert('1')
# w1, h1 = img2.size
# for i in range(1, w1 - 1):
# for j in range(1, h1 - 1):
# up_color = img2.getpixel((i - 1, j))
# down_color = img2.getpixel((i + 1, j))
# if up_color == 255 and down_color == 255:
# img2.putpixel((i, j), 255)
# left_color = img2.getpixel((i, j - 1))
# right_color = img2.getpixel((i, j + 1))
# if left_color == 255 and right_color == 255:
# img2.putpixel((i, j), 255)
# for x in range(w1):
# for y in range(h1):
# if img2.getpixel((x, y)) != 255:
# img2.putpixel((x, y), 1)
# else:
# img2.putpixel((x, y), 0)
# train1.append(str(img2.getpixel((x, y))))
# with open("e:\\image\\imagetext\\%s_%s.txt" % (str(i1), str(d)), 'a') as f:
# f.writelines(''.join(train1) + '\n')
# # train1 = []

效果图如下所示:

【每周一篇20170723】验证码识别方法

到这里,我们的训练集已经完成;

同样的方法,将需要验证的图片通过同样的方法得到相应的测试集;

三、通过sklearn进行预测

通过sklearn对验证码进行预测,那么预测的效果基本上5个数字其中有1个数字会出现失误,如果改用KNN+设定投票次数,结果会有很大的提升,这个就需要各位小伙伴自已动手啦;

# import os,operator
# import numpy as np
# def traindata():
# listdir=os.listdir("E:\\image\\imagetext")
# labels1=[]
# train=np.zeros((len(listdir),1024))
# train1=[]
# i=0
# for linedir in listdir:
# i+=1
# labels1.append(linedir.split('_')[0])
# with open("E:\\image\\imagetext\\"+linedir,'r') as f:
# for line in f.readlines():
# train1.extend(list(line)[:-1])
# train[i-1,:]=train1
# train1=[]
# labels=np.array(labels1)
# return train,labels
# def testdata():
# listdir=os.listdir("e:\\image\\test")
# labels1=[]
# train=np.zeros((len(listdir),1024))
# train1=[]
# i=0
# for linedir in listdir:
# i+=1
# labels1.append(linedir.split('_')[0])
# with open("e:\\image\\test\\"+linedir,'r') as f:
# for line in f.readlines():
# train1.extend(list(line)[:-1])
# train[i-1,:]=train1
# train1=[]
# labels=np.array(labels1)
# return train,labels
# from sklearn.ensemble import GradientBoostingClassifier
# traindata1,trainlabels=traindata()
# testdata1,testlabels=testdata()
# clf1=GradientBoostingClassifier()
# clf1.fit(traindata1,trainlabels)
# result1=clf1.predict(testdata1)
# from sklearn.neighbors import KNeighborsClassifier
# lr=KNeighborsClassifier()
# lr.fit(traindata1,trainlabels)
# result=lr.predict(testdata1)
# print(result)

好长时间没有写东西,有点生疏,以后还是需要坚持,加油~



Django相关文章列表





机器学习和数据分析相关文章列表









爬虫相关文章列表








Excel相关文章列表






【每周一篇20170723】验证码识别方法



www.vbafans.com


QQ群:




以上是关于每周一篇20170723验证码识别方法的主要内容,如果未能解决你的问题,请参考以下文章

图片识别之验证码识别

图形验证码识别——图像预处理:二值化

验证码识别之模板匹配方法

简单的验证码识别

图片识别之验证码识别

验证码的识别