From 268ed5175ec02bf03412bd5bb1629c52f1b2072a Mon Sep 17 00:00:00 2001 From: Martin Laasmaa Date: Thu, 18 Dec 2025 12:52:13 +0200 Subject: [PATCH] Appling pseudo channels for RGB --- src/utils/ultralytics_16bit_patch.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/utils/ultralytics_16bit_patch.py b/src/utils/ultralytics_16bit_patch.py index 45ca205..1e30729 100644 --- a/src/utils/ultralytics_16bit_patch.py +++ b/src/utils/ultralytics_16bit_patch.py @@ -44,7 +44,7 @@ def apply_ultralytics_16bit_tiff_patches(*, force: bool = False) -> None: _original_imread = ul_patches.imread def tifffile_imread( - filename: str, flags: int = cv2.IMREAD_COLOR + filename: str, flags: int = cv2.IMREAD_COLOR, pseudo_rgb: bool = False ) -> Optional[np.ndarray]: """Replacement for [`ultralytics.utils.patches.imread()`](venv/lib/python3.12/site-packages/ultralytics/utils/patches.py:20). @@ -75,7 +75,28 @@ def apply_ultralytics_16bit_tiff_patches(*, force: bool = False) -> None: # For grayscale data we replicate channels (no scaling, no quantization). if flags != cv2.IMREAD_GRAYSCALE: if arr.shape[2] == 1: - arr = np.repeat(arr, 3, axis=2) + if pseudo_rgb: + gamma = 0.3 + a1 = arr.copy().astype(np.float32) + a1 -= np.percentile(a1, 2) + a1[a1 < 0] = 0 + p98 = np.percentile(a1, 98) + a1[a1 > p98] = p98 + a1 /= a1.max() + + a2 = a1.copy() + a2 = a2**gamma + a2 /= a2.max() + + a3 = a1.copy() + p90 = np.percentile(a3, 90) + a3[a3 > p90] = p90 + a3 /= a3.max() + + arr = np.concatenate([a1, a2, a3], axis=2) + + else: + arr = np.repeat(arr, 3, axis=2) elif arr.shape[2] >= 3: arr = arr[:, :, :3]