美文网首页
进阶图像识别学习

进阶图像识别学习

作者: chliar | 来源:发表于2018-04-21 17:26 被阅读0次
    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                                        # 返回每一行中的最后一个值 拼接起来
    
    

    相关文章

      网友评论

          本文标题:进阶图像识别学习

          本文链接:https://www.haomeiwen.com/subject/ewzxlftx.html