# -*- coding: utf-8 -*-
"""
Created on 2019-08-22 09:37:36
@author: fmiorell
"""
# This script registers the "turbo" colormap to matplotlib, and the reversed version as "turbo_r"
# Reference: https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html
import os
from PIL import Image
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import cv2
turbo_colormap_data = np.array(
[[0, 0, 0],
#[0.18995, 0.07176, 0.23217],
[0.19483, 0.08339, 0.26149],
[0.19956, 0.09498, 0.29024],
[0.20415, 0.10652, 0.31844],
[0.20860, 0.11802, 0.34607],
[0.21291, 0.12947, 0.37314],
[0.21708, 0.14087, 0.39964],
[0.22111, 0.15223, 0.42558],
[0.22500, 0.16354, 0.45096],
[0.22875, 0.17481, 0.47578],
[0.23236, 0.18603, 0.50004],
[0.23582, 0.19720, 0.52373],
[0.23915, 0.20833, 0.54686],
[0.24234, 0.21941, 0.56942],
[0.24539, 0.23044, 0.59142],
[0.24830, 0.24143, 0.61286],
[0.25107, 0.25237, 0.63374],
[0.25369, 0.26327, 0.65406],
[0.25618, 0.27412, 0.67381],
[0.25853, 0.28492, 0.69300],
[0.26074, 0.29568, 0.71162],
[0.26280, 0.30639, 0.72968],
[0.26473, 0.31706, 0.74718],
[0.26652, 0.32768, 0.76412],
[0.26816, 0.33825, 0.78050],
[0.26967, 0.34878, 0.79631],
[0.27103, 0.35926, 0.81156],
[0.27226, 0.36970, 0.82624],
[0.27334, 0.38008, 0.84037],
[0.27429, 0.39043, 0.85393],
[0.27509, 0.40072, 0.86692],
[0.27576, 0.41097, 0.87936],
[0.27628, 0.42118, 0.89123],
[0.27667, 0.43134, 0.90254],
[0.27691, 0.44145, 0.91328],
[0.27701, 0.45152, 0.92347],
[0.27698, 0.46153, 0.93309],
[0.27680, 0.47151, 0.94214],
[0.27648, 0.48144, 0.95064],
[0.27603, 0.49132, 0.95857],
[0.27543, 0.50115, 0.96594],
[0.27469, 0.51094, 0.97275],
[0.27381, 0.52069, 0.97899],
[0.27273, 0.53040, 0.98461],
[0.27106, 0.54015, 0.98930],
[0.26878, 0.54995, 0.99303],
[0.26592, 0.55979, 0.99583],
[0.26252, 0.56967, 0.99773],
[0.25862, 0.57958, 0.99876],
[0.25425, 0.58950, 0.99896],
[0.24946, 0.59943, 0.99835],
[0.24427, 0.60937, 0.99697],
[0.23874, 0.61931, 0.99485],
[0.23288, 0.62923, 0.99202],
[0.22676, 0.63913, 0.98851],
[0.22039, 0.64901, 0.98436],
[0.21382, 0.65886, 0.97959],
[0.20708, 0.66866, 0.97423],
[0.20021, 0.67842, 0.96833],
[0.19326, 0.68812, 0.96190],
[0.18625, 0.69775, 0.95498],
[0.17923, 0.70732, 0.94761],
[0.17223, 0.71680, 0.93981],
[0.16529, 0.72620, 0.93161],
[0.15844, 0.73551, 0.92305],
[0.15173, 0.74472, 0.91416],
[0.14519, 0.75381, 0.90496],
[0.13886, 0.76279, 0.89550],
[0.13278, 0.77165, 0.88580],
[0.12698, 0.78037, 0.87590],
[0.12151, 0.78896, 0.86581],
[0.11639, 0.79740, 0.85559],
[0.11167, 0.80569, 0.84525],
[0.10738, 0.81381, 0.83484],
[0.10357, 0.82177, 0.82437],
[0.10026, 0.82955, 0.81389],
[0.09750, 0.83714, 0.80342],
[0.09532, 0.84455, 0.79299],
[0.09377, 0.85175, 0.78264],
[0.09287, 0.85875, 0.77240],
[0.09267, 0.86554, 0.76230],
[0.09320, 0.87211, 0.75237],
[0.09451, 0.87844, 0.74265],
[0.09662, 0.88454, 0.73316],
[0.09958, 0.89040, 0.72393],
[0.10342, 0.89600, 0.71500],
[0.10815, 0.90142, 0.70599],
[0.11374, 0.90673, 0.69651],
[0.12014, 0.91193, 0.68660],
[0.12733, 0.91701, 0.67627],
[0.13526, 0.92197, 0.66556],
[0.14391, 0.92680, 0.65448],
[0.15323, 0.93151, 0.64308],
[0.16319, 0.93609, 0.63137],
[0.17377, 0.94053, 0.61938],
[0.18491, 0.94484, 0.60713],
[0.19659, 0.94901, 0.59466],
[0.20877, 0.95304, 0.58199],
[0.22142, 0.95692, 0.56914],
[0.23449, 0.96065, 0.55614],
[0.24797, 0.96423, 0.54303],
[0.26180, 0.96765, 0.52981],
[0.27597, 0.97092, 0.51653],
[0.29042, 0.97403, 0.50321],
[0.30513, 0.97697, 0.48987],
[0.32006, 0.97974, 0.47654],
[0.33517, 0.98234, 0.46325],
[0.35043, 0.98477, 0.45002],
[0.36581, 0.98702, 0.43688],
[0.38127, 0.98909, 0.42386],
[0.39678, 0.99098, 0.41098],
[0.41229, 0.99268, 0.39826],
[0.42778, 0.99419, 0.38575],
[0.44321, 0.99551, 0.37345],
[0.45854, 0.99663, 0.36140],
[0.47375, 0.99755, 0.34963],
[0.48879, 0.99828, 0.33816],
[0.50362, 0.99879, 0.32701],
[0.51822, 0.99910, 0.31622],
[0.53255, 0.99919, 0.30581],
[0.54658, 0.99907, 0.29581],
[0.56026, 0.99873, 0.28623],
[0.57357, 0.99817, 0.27712],
[0.58646, 0.99739, 0.26849],
[0.59891, 0.99638, 0.26038],
[0.61088, 0.99514, 0.25280],
[0.62233, 0.99366, 0.24579],
[0.63323, 0.99195, 0.23937],
[0.64362, 0.98999, 0.23356],
[0.65394, 0.98775, 0.22835],
[0.66428, 0.98524, 0.22370],
[0.67462, 0.98246, 0.21960],
[0.68494, 0.97941, 0.21602],
[0.69525, 0.97610, 0.21294],
[0.70553, 0.97255, 0.21032],
[0.71577, 0.96875, 0.20815],
[0.72596, 0.96470, 0.20640],
[0.73610, 0.96043, 0.20504],
[0.74617, 0.95593, 0.20406],
[0.75617, 0.95121, 0.20343],
[0.76608, 0.94627, 0.20311],
[0.77591, 0.94113, 0.20310],
[0.78563, 0.93579, 0.20336],
[0.79524, 0.93025, 0.20386],
[0.80473, 0.92452, 0.20459],
[0.81410, 0.91861, 0.20552],
[0.82333, 0.91253, 0.20663],
[0.83241, 0.90627, 0.20788],
[0.84133, 0.89986, 0.20926],
[0.85010, 0.89328, 0.21074],
[0.85868, 0.88655, 0.21230],
[0.86709, 0.87968, 0.21391],
[0.87530, 0.87267, 0.21555],
[0.88331, 0.86553, 0.21719],
[0.89112, 0.85826, 0.21880],
[0.89870, 0.85087, 0.22038],
[0.90605, 0.84337, 0.22188],
[0.91317, 0.83576, 0.22328],
[0.92004, 0.82806, 0.22456],
[0.92666, 0.82025, 0.22570],
[0.93301, 0.81236, 0.22667],
[0.93909, 0.80439, 0.22744],
[0.94489, 0.79634, 0.22800],
[0.95039, 0.78823, 0.22831],
[0.95560, 0.78005, 0.22836],
[0.96049, 0.77181, 0.22811],
[0.96507, 0.76352, 0.22754],
[0.96931, 0.75519, 0.22663],
[0.97323, 0.74682, 0.22536],
[0.97679, 0.73842, 0.22369],
[0.98000, 0.73000, 0.22161],
[0.98289, 0.72140, 0.21918],
[0.98549, 0.71250, 0.21650],
[0.98781, 0.70330, 0.21358],
[0.98986, 0.69382, 0.21043],
[0.99163, 0.68408, 0.20706],
[0.99314, 0.67408, 0.20348],
[0.99438, 0.66386, 0.19971],
[0.99535, 0.65341, 0.19577],
[0.99607, 0.64277, 0.19165],
[0.99654, 0.63193, 0.18738],
[0.99675, 0.62093, 0.18297],
[0.99672, 0.60977, 0.17842],
[0.99644, 0.59846, 0.17376],
[0.99593, 0.58703, 0.16899],
[0.99517, 0.57549, 0.16412],
[0.99419, 0.56386, 0.15918],
[0.99297, 0.55214, 0.15417],
[0.99153, 0.54036, 0.14910],
[0.98987, 0.52854, 0.14398],
[0.98799, 0.51667, 0.13883],
[0.98590, 0.50479, 0.13367],
[0.98360, 0.49291, 0.12849],
[0.98108, 0.48104, 0.12332],
[0.97837, 0.46920, 0.11817],
[0.97545, 0.45740, 0.11305],
[0.97234, 0.44565, 0.10797],
[0.96904, 0.43399, 0.10294],
[0.96555, 0.42241, 0.09798],
[0.96187, 0.41093, 0.09310],
[0.95801, 0.39958, 0.08831],
[0.95398, 0.38836, 0.08362],
[0.94977, 0.37729, 0.07905],
[0.94538, 0.36638, 0.07461],
[0.94084, 0.35566, 0.07031],
[0.93612, 0.34513, 0.06616],
[0.93125, 0.33482, 0.06218],
[0.92623, 0.32473, 0.05837],
[0.92105, 0.31489, 0.05475],
[0.91572, 0.30530, 0.05134],
[0.91024, 0.29599, 0.04814],
[0.90463, 0.28696, 0.04516],
[0.89888, 0.27824, 0.04243],
[0.89298, 0.26981, 0.03993],
[0.88691, 0.26152, 0.03753],
[0.88066, 0.25334, 0.03521],
[0.87422, 0.24526, 0.03297],
[0.86760, 0.23730, 0.03082],
[0.86079, 0.22945, 0.02875],
[0.85380, 0.22170, 0.02677],
[0.84662, 0.21407, 0.02487],
[0.83926, 0.20654, 0.02305],
[0.83172, 0.19912, 0.02131],
[0.82399, 0.19182, 0.01966],
[0.81608, 0.18462, 0.01809],
[0.80799, 0.17753, 0.01660],
[0.79971, 0.17055, 0.01520],
[0.79125, 0.16368, 0.01387],
[0.78260, 0.15693, 0.01264],
[0.77377, 0.15028, 0.01148],
[0.76476, 0.14374, 0.01041],
[0.75556, 0.13731, 0.00942],
[0.74617, 0.13098, 0.00851],
[0.73661, 0.12477, 0.00769],
[0.72686, 0.11867, 0.00695],
[0.71692, 0.11268, 0.00629],
[0.70680, 0.10680, 0.00571],
[0.69650, 0.10102, 0.00522],
[0.68602, 0.09536, 0.00481],
[0.67535, 0.08980, 0.00449],
[0.66449, 0.08436, 0.00424],
[0.65345, 0.07902, 0.00408],
[0.64223, 0.07380, 0.00401],
[0.63082, 0.06868, 0.00401],
[0.61923, 0.06367, 0.00410],
[0.60746, 0.05878, 0.00427],
[0.59550, 0.05399, 0.00453],
[0.58336, 0.04931, 0.00486],
[0.57103, 0.04474, 0.00529],
[0.55852, 0.04028, 0.00579],
[0.54583, 0.03593, 0.00638],
[0.53295, 0.03169, 0.00705],
[0.51989, 0.02756, 0.00780],
[0.50664, 0.02354, 0.00863],
[0.49321, 0.01963, 0.00955],
#[0.47960, 0.01583, 0.01055]])
[1, 1, 1]])
def RGBToPyCmap(rgbdata):
nsteps = rgbdata.shape[0]
stepaxis = np.linspace(0, 1, nsteps)
rdata = [];
gdata = [];
bdata = []
for istep in range(nsteps):
r = rgbdata[istep, 0]
g = rgbdata[istep, 1]
b = rgbdata[istep, 2]
rdata.append((stepaxis[istep], r, r))
gdata.append((stepaxis[istep], g, g))
bdata.append((stepaxis[istep], b, b))
mpl_data = {'red': rdata,
'green': gdata,
'blue': bdata}
return mpl_data
mpl_data = RGBToPyCmap(turbo_colormap_data)
plt.register_cmap(name='turbo', data=mpl_data, lut=turbo_colormap_data.shape[0])
mpl_data_r = RGBToPyCmap(turbo_colormap_data[::-1, :])
plt.register_cmap(name='turbo_r', data=mpl_data_r, lut=turbo_colormap_data.shape[0])
def searchDirFile(rootDir, list_, end_suffix):
for dir_or_file in os.listdir(rootDir):
filePath = os.path.join(rootDir, dir_or_file)
if os.path.isfile(filePath):
if os.path.basename(filePath).endswith(end_suffix):
list_.append(filePath)
else:
continue
elif os.path.isdir(filePath):
searchDirFile(filePath, list_, end_suffix)
else:
print('not file and dir '+os.path.basename(filePath))
if __name__ == '__main__':
dataset_path = "/home/boyun/"
end_suffix = ".tif"
tif_list = []
searchDirFile(dataset_path, tif_list, end_suffix)
for ind, val in enumerate(tif_list):
dep_filename = val.split('/')[-1].split('.')[0]
path = val.split(dep_filename)[0]
gray_name = val.replace("-D.tif", "-B.png")
dep = Image.open(val)
dep_np = np.array(dep)
gray = Image.open(gray_name)
gray_np = np.array(gray)
# plt RGB
if gray_np.ndim == 2:
gray_np = cv2.cvtColor(gray_np, cv2.COLOR_GRAY2RGB)
#plt.figure()
# plt.figure("Image" + str(ind), figsize=(7, 2))
#
# plt.subplot(121)
# plt.imshow(gray_np)
#
# plt.subplot(122)
# #plt.imshow(dep_np, cmap='turbo_r')
# plt.imshow(dep_np, cmap='turbo')
# plt.colorbar()
# plt.savefig(os.path.join(path, "{}_gray-dep_{}.png".format(dep_filename, str(ind))), dpi=600)
# plt.close()
# # plt.show()
plt.figure("Image" + str(1000+ind))
plt.imshow(dep_np, cmap='turbo')
plt.colorbar()
#plt.savefig(os.path.join(path, "{}_dep_{}.png".format(dep_filename, str(1000+ind))), dpi=600)
plt.tight_layout() # 去除pdf周围白边
plt.savefig(os.path.join(path, "{}_dep_{}.pdf".format(dep_filename, str(1000+ind))), dpi=600)
#plt.savefig(os.path.join(path, "{}_dep_{}.pdf".format(dep_filename, str(2000+ind))), dpi=1000)
plt.close()
#plt.show()
#https://www.freesion.com/article/90411116645/
#从小到大排列, 求取dep_np第95%分位的数值
# vmax = np.percentile(dep_np, 95)
# normalizer = matplotlib.colors.Normalize(vmin=dep_np.min(), vmax=vmax)
# mapper = matplotlib.cm.ScalarMappable(norm=normalizer, cmap='magma_r')
# colormapped_im = (mapper.to_rgba(dep_np)[:, :, :3] * 255).astype(np.uint8)
# plt.figure("Image" + str(3000+ind))
# plt.imshow(colormapped_im)
# #plt.savefig(os.path.join(path, "{}_dep_{}.png".format(dep_filename, str(1000+ind))), dpi=600)
# plt.tight_layout() # 去除pdf周围白边
# plt.savefig(os.path.join(path, "{}_dep_{}.pdf".format(dep_filename, str(3000+ind))), dpi=600)
# plt.close()
import os
import open3d as o3d
from PIL import Image
import numpy as np
import cv2
import matplotlib.pyplot as plt
def searchDirFile(rootDir, list_, end_suffix):
for dir_or_file in os.listdir(rootDir):
filePath = os.path.join(rootDir, dir_or_file)
if os.path.isfile(filePath):
if os.path.basename(filePath).endswith(end_suffix):
list_.append(filePath)
else:
continue
elif os.path.isdir(filePath):
searchDirFile(filePath, list_, end_suffix)
else:
print('not file and dir '+os.path.basename(filePath))
def depth2cloud(depth, gray, intrinsic):
rows = len(depth)
cols = len(depth[0])
pointcloud = []
colors_list = []
for m in range(0, rows):
for n in range(0, cols):
d = depth[m][n]
colors = gray[m][n]
if d == 0:
pass
else:
z = float(d) / intrinsic[2][2]
x = (n-intrinsic[0][2]) * z / intrinsic[0][0]
y = (m-intrinsic[1][2]) * z / intrinsic[1][1]
points = [x, y, z]
pointcloud.append(points)
colors_list.append(colors)
pointcloud_np = np.array(pointcloud, dtype=np.float32)
color_np = np.array(colors_list) / 255
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(pointcloud_np)
pcd.colors = o3d.utility.Vector3dVector(color_np)
return pcd
def depth2cloud_conv(depth, gray, intrinsic, filter_zero=True):
if gray.ndim == 2:
gray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
rows = len(depth)
cols = len(depth[0])
# depth 1544*2064
zs = depth / intrinsic[2][2]
yinds = np.arange(rows).reshape(-1, 1)
yinds = np.tile(yinds, (1, cols))
ys = (yinds - intrinsic[1][2]) * zs / intrinsic[1][1]
xinds = np.arange(cols).reshape(1, -1)
xinds = np.tile(xinds, (rows, 1))
xs = (xinds - intrinsic[0][2]) * zs / intrinsic[0][0]
xs = np.expand_dims(xs, 2)
ys = np.expand_dims(ys, 2)
zs = np.expand_dims(zs, 2)
points = np.concatenate([xs, ys, zs], axis=-1).reshape(-1, 3)
colors = gray.reshape(-1, 3)
if filter_zero:
index = points[:, 2] > 0
points_new = points[index, :].astype(np.float32)
colors_new = colors[index, :].astype(np.float32)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points_new)
pcd.colors = o3d.utility.Vector3dVector(colors_new / 255)
return pcd
if __name__ == '__main__':
dataset_path = "/home/boyun/"
end_suffix = ".tif"
tif_list = []
searchDirFile(dataset_path, tif_list, end_suffix)
for ind, val in enumerate(tif_list):
dep_filename = val.split('/')[-1].split('.')[0]
path = val.split(dep_filename)[0]
gray_name = val.replace("-D.tif", "-B.png")
dep = Image.open(val)
dep_np = np.array(dep)
gray = Image.open(gray_name)
gray_np = np.array(gray)
if gray_np.ndim == 2:
gray_np = cv2.cvtColor(gray_np, cv2.COLOR_GRAY2BGR)
if dep_filename[:3] == 'BJ1':
K = [[2246.31, 0, 1037.54], [0, 2246.32, 809.429], [0, 0, 1]]
elif dep_filename[:3] == 'BJ2':
K = [[2263.52, 0, 1030.43], [0, 2263.47, 808.364], [0, 0, 1]]
#pointcloud = depth2cloud(dep_np, gray_np, K)
pointcloud = depth2cloud_conv(dep_np, gray_np, K)
#o3d.visualization.draw_geometries([pointcloud])
o3d.io.write_point_cloud(os.path.join(path, "{}_color.ply".format(dep_filename)), pointcloud)
#o3d.io.write_point_cloud(os.path.join(path, "{}_color{}.ply".format(dep_filename, str(ind))), pointcloud)
#o3d.visualization.draw_geometries([pointcloud])