File size: 1,324 Bytes
b678162
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np
import PIL.Image
from PIL.PngImagePlugin import PngInfo


def read_depth_from_png(file_path):
    depth = PIL.Image.open(file_path) # Scale the saved image using the metadata
    max_depth = float(depth.info["max_value"])
    min_depth = float(depth.info["min_value"])
    depth = np.array(depth).astype(np.float32)

    # Scale from uint16 range
    depth = (depth / (2 ** 16 - 1)) * (max_depth - min_depth) + min_depth

    # replace the magic constant with positive infinity
    depth[depth == -1.0] = np.inf
    return depth


def write_depth_to_png(outpath_file, depth_pred):
    # MoGe predicts infinity for sky pixels
    depth_pred[np.isinf(depth_pred)] = -1.0

    min_depth = np.min(depth_pred)
    max_depth = np.max(depth_pred)

    # Normalize to [0, 1]
    depth_pred_normalized = (depth_pred - min_depth) / (max_depth - min_depth)

    # Scale to uint16 range
    depth_pred_scaled = np.round(depth_pred_normalized * (2 ** 16 - 1)).astype(np.uint16)

    # Save image with pred and error as uint16
    depth_pred_img = PIL.Image.fromarray(depth_pred_scaled)
    metadata = PngInfo()
    metadata.add_text("max_value", str(max_depth))
    metadata.add_text("min_value", str(min_depth))
    depth_pred_img.save(outpath_file,
                        format="PNG", mode="I", pnginfo=metadata)