vlambda博客
学习文章列表

(tensorflow CNN)验证码识别--生成验证码

    

    python中captcha为生成验证码的库,captcha.image中导入ImageCaptcha类,再实例化一个对象,然后调用对象生成想要的验证码。

        为了做验证码识别这一项目,先学习一下如何随机生成验证码,并以图片方式展示。

        

        1.导入必要的库,并定义好生成验证码所需要的数据集。

        

import tensorflow as tffrom captcha.image import ImageCaptcha # captcha 验证码 ImageCaptcha 生成字符验证码图片import numpy as np import matplotlib.pyplot as plt from PIL import Image # PIL:Python Imaging Libraryimport 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():箭头注释,在箭头的位置可以填写文本 '''

        运行结果: