from captcha.image import ImageCaptcha
from PIL import Image
import numpy as np
VOCAB = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# 词表(字典的)VOCAB的长度
VOCAB_LENGTH = len(VOCAB)
# 验证码个数
CAPTCHA_LENGTH = 4
# 将图片转换成(RGB 三个数) 为 1个像素点的 数组
def generate_captcha(captcha_text):
"""
get captcha text and np array
:param captcha_text: source text
:return: captcha image and array
"""
image = ImageCaptcha()
#生成图片
captcha = image.generate(captcha_text)
# 打开图片加载到内存中
captcha_image = Image.open(captcha)
# 验证码转化成了每个像素的
captcha_array = np.array(captcha_image)
# print(captcha_image)
# captcha_image.show()
return captcha_array
# 将text转化为 One-Hot 编码
def text2vec(text):
"""
text to one-hot vector
:param text: source text
:return: np array
"""
if len(text) > CAPTCHA_LENGTH:
return False
#先构造 [['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],...]10个为一位的矩阵,一共4位(4位数字的验证码)
vector = np.zeros(CAPTCHA_LENGTH * VOCAB_LENGTH)
# enumerate(text) 生成 下标 + 值
for i, c in enumerate(text):
# 将这个值的位置 置1
index = i * VOCAB_LENGTH + VOCAB.index(c)
vector[index] = 1
return vector
逆推
# 将One-Hot 编码转化为 文本
def vec2text(vector):
"""
vector to captcha text
:param vector: np array
:return: text
"""
if not isinstance(vector, np.ndarray): # 判断传入的参数是不是array 矩阵
vector = np.asarray(vector) # array和asarray都可以将结构数据转化为ndarray 但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。
vector = np.reshape(vector, [CAPTCHA_LENGTH, -1]) # reshape 不知道数有多少,把它变成一行有[CAPTCHA_LENGTH, -1]个数,自动算出行
text = ''
for item in vector: # for 遍历行数 i=一行的内容
text += VOCAB[np.argmax(item)] # axis 轴(也就是x轴 列的下标索引)最大值i[9] 是9的下标
return text # 返回每一行中的最后一个值 拼接起来
网友评论