进阶图像识别学习

2018-04-21  本文已影响0人  chliar
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                                        # 返回每一行中的最后一个值 拼接起来

上一篇下一篇

猜你喜欢

热点阅读