File size: 1,847 Bytes
bd4a96a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Colormap utilities: Turbo, Rainbow, and bipolar white-center."""

import numpy as np


def turbo_rgb01(t):
    t = np.clip(np.asarray(t, np.float32), 0, 1)
    r = (34.61 + t * (1172.33 + t * (-10793.56 + t * (33300.12 + t * (-38345.17 + 14829.80 * t))))) / 255.0
    g = (23.31 + t * (557.33 + t * (1225.33 + t * (-3574.96 + t * 2199.29)))) / 255.0
    b = (27.20 + t * (3211.10 + t * (-15327.97 + t * (34592.87 + t * (-30538.66 + 9347.97 * t))))) / 255.0
    rgb = np.stack([r, g, b], axis=-1)
    return (np.clip(rgb, 0, 1) * 255 + 0.5).astype(np.uint8)


def rainbow_rgb01(t):
    t = np.clip(np.asarray(t, np.float32), 0.0, 1.0)
    h = t * 4.0
    i = np.floor(h).astype(np.int32)
    f = h - i
    q = 1.0 - f
    i = np.clip(i, 0, 3)
    zeros = np.zeros_like(t)
    ones = np.ones_like(t)
    r = np.choose(i, [zeros, zeros, f, ones])
    g = np.choose(i, [f, ones, ones, q])
    b = np.choose(i, [ones, q, zeros, zeros])
    start = (t <= 0.0)
    end = (t >= 1.0)
    if np.any(start):
        r[start], g[start], b[start] = 0.0, 0.0, 1.0
    if np.any(end):
        r[end], g[end], b[end] = 1.0, 0.0, 0.0
    rgb = np.stack([r, g, b], axis=-1)
    return (np.clip(rgb, 0, 1) * 255 + 0.5).astype(np.uint8)


def bicolor_white_center(dent_vals, pos=(255, 120, 0), neg=(0, 100, 255)):
    d = np.asarray(dent_vals, np.float32)
    a = np.abs(d)
    scale = float(np.percentile(a, 97)) if a.size else 1.0
    if not np.isfinite(scale) or scale <= 1e-12:
        scale = 1.0
    t = np.clip(a / scale, 0.0, 1.0)[:, None]
    white = np.array([[255, 255, 255]], np.float32)
    pos_c = np.array(pos, np.float32)[None, :]
    neg_c = np.array(neg, np.float32)[None, :]
    out = np.where(d[:, None] >= 0.0,
                   (1.0 - t) * white + t * pos_c,
                   (1.0 - t) * white + t * neg_c)
    return out.astype(np.uint8)