You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python为16位灰度TIFF图像应用*.cube格式LUT

Python实现16位灰度TIFF应用16位RGB Cube LUT

依赖安装

需要安装以下Python库处理图像和LUT:

pip install numpy tifffile pillow

解析Cube格式LUT

Cube格式的3D LUT包含头部定义(LUT_3D_SIZE指定三维网格尺寸)和逐行的RGB数值(通常为0-1范围的浮点数)。以下函数读取并转换为16位整数格式的三维数组:

import numpy as np

def load_cube_lut(lut_path):
    with open(lut_path, 'r') as f:
        lines = [line.strip() for line in f if line.strip() and not line.startswith('#')]
    
    # 获取LUT三维尺寸
    lut_size = None
    for line in lines:
        if line.startswith('LUT_3D_SIZE'):
            lut_size = int(line.split()[-1])
            break
    if not lut_size:
        raise ValueError("Cube文件未包含LUT_3D_SIZE定义")
    
    # 提取并转换RGB数据为16位整数
    rgb_data = []
    for line in lines[lines.index(f'LUT_3D_SIZE {lut_size}')+1:]:
        r, g, b = map(float, line.split())
        rgb_data.append([int(r * 65535), int(g * 65535), int(b * 65535)])
    
    # 重塑为三维LUT数组:(size, size, size, 3)
    return np.array(rgb_data, dtype=np.uint16).reshape(lut_size, lut_size, lut_size, 3), lut_size

读取16位灰度TIFF

使用tifffile库可靠读取16位单通道灰度图像:

import tifffile

def load_16bit_gray_tiff(tiff_path):
    img = tifffile.imread(tiff_path)
    if img.dtype != np.uint16 or len(img.shape) != 2:
        raise TypeError("输入必须是16位单通道灰度TIFF")
    return img

应用LUT到灰度图像

将灰度值映射为LUT的三维索引(灰度值同时作为R、G、B维度的输入),提取对应RGB值生成彩色图像:

def apply_lut_to_gray(img, lut, lut_size):
    # 归一化灰度值到0-1范围,计算LUT索引
    norm_img = img / 65535.0
    idx = (norm_img * (lut_size - 1)).astype(np.int32)
    # 利用广播机制提取对应RGB值
    return lut[idx, idx, idx]

保存16位RGB TIFF

保存处理后的彩色图像为16位RGB格式:

def save_16bit_rgb_tiff(img, output_path):
    tifffile.imwrite(output_path, img, dtype=np.uint16)

完整执行代码

if __name__ == "__main__":
    # 替换为实际文件路径
    LUT_PATH = "your_lut_file.cube"
    TIFF_PATH = "your_core_image.tif"
    OUTPUT_PATH = "processed_core_rgb.tif"
    
    lut, lut_size = load_cube_lut(LUT_PATH)
    gray_img = load_16bit_gray_tiff(TIFF_PATH)
    colored_img = apply_lut_to_gray(gray_img, lut, lut_size)
    save_16bit_rgb_tiff(colored_img, OUTPUT_PATH)
    print(f"处理完成,结果已保存至 {OUTPUT_PATH}")

关键注意事项

  • 若Cube文件中的RGB值已为16位整数(而非0-1浮点数),需修改load_cube_lut函数,直接读取整数无需乘以65535。
  • 确保LUT为3D类型(即包含LUT_3D_SIZE),1D LUT需调整索引逻辑。
  • 全程使用uint16数据类型,避免16位图像数据溢出或精度损失。

内容的提问来源于stack exchange,提问作者rach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:17:20