| import torch |
| from colorspacious import cspace_convert |
| from einops import rearrange |
| from jaxtyping import Float |
| from matplotlib import cm |
| from torch import Tensor |
|
|
|
|
| def apply_color_map( |
| x: Float[Tensor, " *batch"], |
| color_map: str = "inferno", |
| ) -> Float[Tensor, "*batch 3"]: |
| cmap = cm.get_cmap(color_map) |
|
|
| |
| mapped = cmap(x.detach().clip(min=0, max=1).cpu().numpy())[..., :3] |
|
|
| |
| return torch.tensor(mapped, device=x.device, dtype=torch.float32) |
|
|
|
|
| def apply_color_map_to_image( |
| image: Float[Tensor, "*batch height width"], |
| color_map: str = "inferno", |
| ) -> Float[Tensor, "*batch 3 height with"]: |
| image = apply_color_map(image, color_map) |
| return rearrange(image, "... h w c -> ... c h w") |
|
|
|
|
| def apply_color_map_2d( |
| x: Float[Tensor, "*#batch"], |
| y: Float[Tensor, "*#batch"], |
| ) -> Float[Tensor, "*batch 3"]: |
| red = cspace_convert((189, 0, 0), "sRGB255", "CIELab") |
| blue = cspace_convert((0, 45, 255), "sRGB255", "CIELab") |
| white = cspace_convert((255, 255, 255), "sRGB255", "CIELab") |
| x_np = x.detach().clip(min=0, max=1).cpu().numpy()[..., None] |
| y_np = y.detach().clip(min=0, max=1).cpu().numpy()[..., None] |
|
|
| |
| interpolated = x_np * red + (1 - x_np) * blue |
|
|
| |
| interpolated = y_np * interpolated + (1 - y_np) * white |
|
|
| |
| rgb = cspace_convert(interpolated, "CIELab", "sRGB1") |
| return torch.tensor(rgb, device=x.device, dtype=torch.float32).clip(min=0, max=1) |
|
|