(tensorflow CNN)验证码识别--生成验证码
python中captcha为生成验证码的库,captcha.image中导入ImageCaptcha类,再实例化一个对象,然后调用对象生成想要的验证码。
为了做验证码识别这一项目,先学习一下如何随机生成验证码,并以图片方式展示。
1.导入必要的库,并定义好生成验证码所需要的数据集。
import tensorflow as tf
from captcha.image import ImageCaptcha # captcha 验证码 ImageCaptcha 生成字符验证码图片
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image # PIL:Python Imaging Library
import random
number = ['0','1','2','3','4','5','6','7','8','9']
alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
ALPHABET = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
2.定义能够随机产生4位随机验证码的函数
def random_captcha_text(char_set=number+alphabet+ALPHABET, captcha_size=4): # 定义随机验证码集
captcha_text = []
for i in range(captcha_size):
c = random.choice(char_set)
captcha_text.append(c)
return captcha_text
其中,循环4次,每次从char_set中随机选取一个数字或者字母,添加到列表中。最后返回列表。
3.定义生成验证码文本和图片的函数
def gen_captcha_text_and_image(): # 定义 生成验证码文本和图片
image = ImageCaptcha() # 将类实例化 生成对象
captcha_text = random_captcha_text() # 调用上面函数
captcha_text = ''.join(captcha_text) # 用空格连接每个字符
captcha = image.generate(captcha_text) # 生成验证码图片
#image.write(captcha_text, captcha_text + '.jpg')
captcha_image = Image.open(captcha) # 利用python中的PIL中的Image打开图片
captcha_image = np.array(captcha_image) # 将图片转换为数组形式
return captcha_text, captcha_image # 返回值:列表 和 验证码图片的数组形式
这里重要一步是将生成的验证码图片转化为数组的形式保存。captcha为验证码图片,需要先读取。利用Image.open(captcha)读取图片,这里的Image为PIL库中所导入的模块。最后,用numpy.array()转换格式。返回值为验证码列表和验证码图片的数组格式。
4.调用函数,画图。
if __name__ == '__main__':
text, image = gen_captcha_text_and_image()
f = plt.figure()
ax = f.add_subplot(111) # plt.figure().add_subplot() ==== fig,axes=plt.subplots()
ax.text(0.1, 0.9,text, ha='center', va='center', transform=ax.transAxes)
plt.imshow(image)
plt.show()
调用gen_captcha_text_and_image()函数,返回text、image。f = plt.figure()建立画图区域,ax=f.add_subplot()添加子图。ax.text()添加注释。
添加注释的3种方法:
'''
添加注释的3种方法
fig=plt.figure() ax=fig.add_subplot(1,1,1)
ax.text():文本注释,只能填写文本
text(x, y, s, fontdict=None, withdash=False, **kwargs)
x,y:注释的坐标位置(标量)
s:注释的内容(字符串)
fontdict:重新设置注释内容的文本格式,包括字体颜色、背景大小和颜色、字体大小等(字典)
withdash:创建一个替代注释内容“s”的对象,参照英文单词解释,这应该是一个破折号
**kwargs
va:垂直分布情况
ha:水平分布情况
bbox:给文字加上一个框子(例如:bbox=dict(facecolor=’red’, alpha=0.5))
fontsize:字体大小
ax.arrow():箭头标记,不能填写文本
ax.annotate():箭头注释,在箭头的位置可以填写文本
'''
运行结果: