From b077e433cdf19ad2e848d4f5bb9a8e8cbb83f9f8 Mon Sep 17 00:00:00 2001 From: smgr Date: Wed, 21 Jan 2026 18:18:05 -0800 Subject: [PATCH] implement consistent quantization of srgb8 for palette figure --- images/release/1.5.1/palette-bare.png | Bin 15246 -> 14524 bytes images/release/1.5.1/palette.png | Bin 33474 -> 31783 bytes monobiome/palette.py | 8 ++++++-- monobiome/plotting.py | 12 +++++++----- monobiome/util.py | 11 +++++++++++ scripts/prepare.sh | 3 +++ 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/images/release/1.5.1/palette-bare.png b/images/release/1.5.1/palette-bare.png index 6e046df460f40a62d1791240da096d43179d49e4..e64e2c3709f2d626a8389104fdec8f65de2f030b 100644 GIT binary patch literal 14524 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 literal 15246 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 diff --git a/images/release/1.5.1/palette.png b/images/release/1.5.1/palette.png index 9a79c13bf5b22e2593c3afe47a29f13de4972f92..f66310714eeda1b300fffda98a7add41c96a153e 100644 GIT binary patch literal 31783 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 I!R+XN0RkrkumAu6 diff --git a/monobiome/palette.py b/monobiome/palette.py index af34e66..2011f27 100644 --- a/monobiome/palette.py +++ b/monobiome/palette.py @@ -5,6 +5,10 @@ from importlib.metadata import version from coloraide import Color +from monobiome.util import ( + hex_from_rgb8, + srgb8_from_color, +) from monobiome.constants import ( h_map, L_points, @@ -24,8 +28,8 @@ def compute_hlc_map(notation: str) -> dict[str, Any]: oklch = Color('oklch', [_l/100, _c, _h]) if notation == "hex": - srgb = oklch.convert('srgb') - c_str = srgb.to_string(hex=True) + rgb8 = srgb8_from_color(oklch) + c_str = hex_from_rgb8(rgb8) elif notation == "oklch": ol, oc, oh = oklch.convert('oklch').coords() c_str = f"oklch({ol*100:.1f}% {oc:.4f} {oh:.1f})" diff --git a/monobiome/plotting.py b/monobiome/plotting.py index 43274ca..788c463 100644 --- a/monobiome/plotting.py +++ b/monobiome/plotting.py @@ -5,6 +5,7 @@ import matplotlib.pyplot as plt from coloraide import Color from matplotlib.collections import LineCollection +from monobiome.util import srgb8_from_color from monobiome.palette import compute_hlc_map from monobiome.constants import ( h_map, @@ -87,7 +88,9 @@ def plot_hue_chroma_star() -> tuple[plt.Figure, plt.Axes]: _h = h_map[h_str] h_colors = [ - Color('oklch', [_l/100, _c, _h]).convert("srgb") + Color( + 'oklch', [_l/100, _c, _h] + ).convert("srgb").fit(method="oklch-chroma") for _l, _c in zip(L_points, Lpoints_Cstar, strict=True) ] @@ -124,7 +127,7 @@ def palette_image( h = row_count * cell_size w = max_cols * cell_size - img = np.ones((h, w, 3), float) + img = np.ones((h, w, 3), int) lightness_keys_per_row = [] @@ -133,8 +136,7 @@ def palette_image( lkeys = sorted(shades.keys()) lightness_keys_per_row.append(lkeys) for c, k in enumerate(lkeys): - col = Color(shades[k]).convert("srgb").fit(method="clip") - rgb = [col["r"], col["g"], col["b"]] + rgb = srgb8_from_color(shades[k]) r0, r1 = r * cell_size, (r + 1) * cell_size c0, c1 = c * cell_size, (c + 1) * cell_size img[r0:r1, c0:c1, :] = rgb @@ -156,7 +158,7 @@ def show_palette( if show_labels: fig, ax = plt.subplots(figsize=(fig_w, fig_h), dpi=dpi) - ax.imshow(img, interpolation="none", origin="upper") + ax.imshow(img, interpolation="nearest", origin="upper") ax.set_xticks([]) ytick_pos = [(i + 0.5) * cell_size for i in range(len(names))] diff --git a/monobiome/util.py b/monobiome/util.py index 9128649..dad0909 100644 --- a/monobiome/util.py +++ b/monobiome/util.py @@ -2,6 +2,7 @@ import math from types import GenericAlias from argparse import ArgumentParser, _SubParsersAction +import numpy as np from coloraide import Color _SubParsersAction.__class_getitem__ = classmethod(GenericAlias) @@ -33,3 +34,13 @@ def oklch_distance(xc: Color, yc: Color) -> float: dz = l1 - l2 return (dx**2 + dy**2 + dz**2)**0.5 + +def srgb8_from_color(c: str | Color) -> np.ndarray: + c = Color(c).convert("srgb").fit(method="oklch-chroma") + rgb = np.array([c["r"], c["g"], c["b"]], dtype=float) + rgb8 = np.clip(np.round(rgb * 255), 0, 255).astype(np.uint8) + + return rgb8 + +def hex_from_rgb8(rgb8: np.ndarray) -> str: + return f"#{int(rgb8[0]):02x}{int(rgb8[1]):02x}{int(rgb8[2]):02x}" diff --git a/scripts/prepare.sh b/scripts/prepare.sh index 2baa32e..89c025b 100755 --- a/scripts/prepare.sh +++ b/scripts/prepare.sh @@ -11,3 +11,6 @@ uv run monobiome palette -n oklch -f toml -o colors/oklch-palette.toml # generate provided app config "$script_dir/generate.sh" + +# generate release plots +uv run "$script_dir/plots.py"