Source code for punchbowl.data.visualize
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
from skimage.color import lab2rgb
[docs]
def _cmap_punch() -> LinearSegmentedColormap:
"""Generate PUNCH colormap."""
# Define key colors in LAB space
black_lab = np.array([0, 0, 0])
orange_lab = np.array([50, 15, 50])
white_lab = np.array([100, 0, 0])
# Define the number of colors
n = 256
lab_colors = np.zeros((n, 3))
# Transition from black to orange
for i in range(n // 2):
t = i / (n // 2 - 1)
lab_colors[i] = black_lab * (1 - t) + orange_lab * t
# Transition from orange to white
for i in range(n // 2, n):
t = (i - n // 2) / (n // 2 - 1)
lab_colors[i] = orange_lab * (1 - t) + white_lab * t
rgb_colors = lab2rgb(lab_colors.reshape(1, -1, 3)).reshape(n, 3)
return LinearSegmentedColormap.from_list("PUNCH", rgb_colors, N=n)
cmap_punch = _cmap_punch()
[docs]
def radial_distance(h: int, w: int, center: tuple[int, int] | None = None, radius: float | None = None) -> np.ndarray:
"""Create radial distance array."""
if center is None:
center = (int(w/2), int(h/2))
if radius is None:
radius = min([center[0], center[1], w-center[0], h-center[1]])
y, x = np.ogrid[:h, :w]
dist_arr = np.sqrt((x - center[0])**2 + (y - center[1])**2)
return dist_arr / dist_arr.max()
[docs]
def radial_filter(data: np.ndarray) -> np.ndarray:
"""Filter data with radial distance function."""
return data * radial_distance(*data.shape) ** 2.5