zoukankan      html  css  js  c++  java
  • 扩展图片像素,恢复图片像素

    原图.png

    注意:原图中只有很暗的一些点,这些点表示着实际的物理深度(距离)。
    expand.png

    注意:扩展后的图片像素更加明显了

    功能介绍:
    1、从一个文件夹中读取depth图片,将其像素以最大值扩展到255的标准归一化,并获取图片的像素最大值,并记录在txt文件中保存,同时应保存对应的文件名。
    2、使用保存的最大值数据,恢复图片像素范围

    特别说明:图片文件为png格式,8bit的单层图(即灰度图),不确定此代码是否适用于其他文件类型,未做测试。

    import numpy as np
    from PIL import Image
    import re
    import os
    
    def get_path_list(file_dir, fname):
        L = []
        for root, dirs, files in os.walk(file_dir):
            for file in sorted(files):    # 遍历文件目录下每一个文件
                if fname in file:  # 判断是否包含指定字符串
                    L.append(os.path.join(root, file))
    
    '''
    创建文件夹
    '''
    def make_dirs(paths):
        if isinstance(paths, list) and not isinstance(paths, str):
            for path in paths:
                mkdir(path)
        else:
            mkdir(paths)
    
    def mkdir(path):
        if not os.path.exists(path):
            os.makedirs(path)
    
    '''
    归一化为min-max范围
    '''
    def normalize(image, max, min):
        image_max = np.max(image)
        image_min = np.min(image)
        normalized = (image - image_min) / (image_max - image_min) * (max - min)
        return normalized
    
    '''
    获取最大值并保存到txt
    '''
    def save_max_data(image, image_name, save_file):
        image_max = np.max(image)
        # image_min = np.min(image)
    
        message = 'image: %s, max: %s
    ' % (image_name, image_max)
        with open(save_file, "a") as file:
            file.write('%s' % message)
    
        return image_max
    
    '''
    读取txt文件内容,并缓存到列表
    '''
    def get_data(dir):
        data = []
        data_list = []
        fp = open(dir, 'r')
        for ln in fp:
            if 'image: ' in ln:
                '''
                image: 964.png, max: 77
                image: 965.png, max: 77
                '''
                #eopch
                arr = re.findall(r'image: d+', ln)
                image = int(arr[0].strip(' ')[7:])
                data.append(image)
                #iters
                arr1 = re.findall(r'max: d+', ln)
                max = int(arr1[0].strip(' ')[4:])
                data.append(max)
    
                data_list.append(data)
            data = []
        fp.close()
        return data_list
    
    '''
    像素数据扩展:(原图片路径, 要保存的路径, 最大值保存文件路径)
    '''
    def pix_expand(dir, expand_dir, max_data_file):
        image_list = os.listdir(dir)    # 文件夹dir内的文件列表
    
        make_dirs(expand_dir)
    
        for dir1 in image_list:
            imgpath = dir + '/' + dir1
    
            image = Image.open(imgpath)
            image_max = save_max_data(image, dir1, max_data_file)  # 保存图片像素最大值,(图片,文件名),返回图片最大值
            image_normalize = normalize(image, 255, 0)  # 归一化图片
    
            image2 = Image.fromarray(image_normalize).convert('L')  # 转换图像数据为Image可读形式
            # image2.show()
            image2.save('%s/%s' % (expand_dir, dir1))
    
            print(image_max)
        print("expand done.")
    '''
    像素数据恢复:(最大值保存文件路径,扩张后的图片存储路径,重建后的图片保存路径)
    '''
    def reconstruction(data_file_dir, expand_dir, reconstruction_dir):
        image_list = os.listdir(expand_dir)  # 文件夹dir内的文件列表
        data = get_data(data_file_dir)
        # print(data)
        # print(data[2][0])
    
        for dir1 in image_list:
            imgpath = expand_dir + '/' + dir1
            # print(dir1)
            image = Image.open(imgpath)
            image_name = int(re.sub("D", "", dir1))
    
            for image_parameter in data:
                if image_parameter[0] == image_name:
                    image_reconstruct = normalize(image, image_parameter[1], 0)
                    image2 = Image.fromarray(image_reconstruct).convert('L')  # 转换图像数据为Image可读形式
                    # image2.show()
                    make_dirs(reconstruction_dir)
                    image2.save('./%s/%s' % (reconstruction_dir, dir1))
        print("reconstruction done.")
    
    if __name__ == '__main__':
    
        dir = './sparse'  # 原图片文件夹
        expand_dir = './sparse1'
        reconstruction_dir = './sparse2'
        max_data_file = './sparse_max.txt'
    
        sparse_data_file = os.path.join('./depth_max.txt')   # 要保存的最大值文件路径
    
        pix_expand(dir, expand_dir, max_data_file)
    
        reconstruction(max_data_file, expand_dir, reconstruction_dir)
    
  • 相关阅读:
    一个小企业招人的胡思乱想
    7 搜索关键词 && 提问
    6. 搜索&&学习常用站点
    5. Github的使用
    2020 renew 博客目录
    4. 版本控制
    3. 项目管理规范 && 命名方式规范
    2.7 C#语法的学习(小结)
    2.6 C#语法的学习(六) && 异常处理 && 调试
    2.5 C#语法的学习(五) && 判断
  • 原文地址:https://www.cnblogs.com/huangtao36/p/8530438.html
Copyright © 2011-2022 走看看