-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathflow_to_img.py
53 lines (45 loc) · 1.65 KB
/
flow_to_img.py
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
42
43
44
45
46
47
48
49
50
51
52
53
import numpy as np
from matplotlib.colors import hsv_to_rgb
'''
Paper: `Deep learning for precipitation nowcasting: a benchmark and a new model`
'''
def flow_to_img(flow_dat, max_displacement=None):
"""Convert optical flow data to HSV images
Parameters
----------
flow_dat : np.ndarray
Shape: (seq_len, 2, H, W)
max_displacement : float or None
Returns
-------
rgb_dat : np.ndarray
Shape: (seq_len, 3, H, W)
"""
assert flow_dat.ndim == 4
flow_scale = np.square(flow_dat).sum(axis=1, keepdims=True)
flow_x = flow_dat[:, :1, :, :]
flow_y = flow_dat[:, 1:, :, :]
flow_angle = np.arctan2(flow_y, flow_x)
flow_angle[flow_angle < 0] += np.pi * 2
v = np.ones((flow_dat.shape[0], 1, flow_dat.shape[2], flow_dat.shape[3]),
dtype=np.float32)
if max_displacement is None:
flow_scale_max = np.sqrt(flow_scale.max())
else:
flow_scale_max = max_displacement
h = flow_angle / (2 * np.pi)
s = np.sqrt(flow_scale) / flow_scale_max
hsv_dat = np.concatenate((h, s, v), axis=1)
rgb_dat = hsv_to_rgb(hsv_dat.transpose((0, 2, 3, 1))).transpose((0, 3, 1, 2))
return rgb_dat
'''
Paper: `A Dynamic Multi-Scale Voxel Flow Network for Video Prediction`
'''
def flow2rgb(flow_map_np):
h, w, _ = flow_map_np.shape
rgb_map = np.ones((h, w, 3)).astype(np.float32)
normalized_flow_map = flow_map_np / (np.abs(flow_map_np).max())
rgb_map[:, :, 0] += normalized_flow_map[:, :, 0]
rgb_map[:, :, 1] -= 0.5 * (normalized_flow_map[:, :, 0] + normalized_flow_map[:, :, 1])
rgb_map[:, :, 2] += normalized_flow_map[:, :, 1]
return rgb_map.clip(0, 1)