注意:原圖中只有很暗的一些點,這些點表示着實際的物理深度(距離)。
注意:擴展后的圖片像素更加明顯了
功能介紹:
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)