扩展图片像素,恢复图片像素

原图.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\n' % (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: \b\d+\b', ln)
            image = int(arr[0].strip(' ')[7:])
            data.append(image)
            #iters
            arr1 = re.findall(r'max: \b\d+\b', 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)
posted @ 2018-03-08 19:38  韬小虾  阅读(2553)  评论(0编辑  收藏  举报