如何仅使用NumPy实现tfio的rgb2xyz颜色空间转换功能?
纯NumPy实现与tfio精度对齐的rgb_to_xyz转换
核心特性
- 逐步骤复刻tfio官方
rgb_to_xyz计算逻辑,无自定义参数调整,可实现逐元素精度匹配 - 同时支持3维
[H, W, 3]单图输入、4维[N, H, W, 3]批量输入 - 自动适配输入数组的浮点类型,支持
float16/float32/float64三种dtype,与tfio的输入约束完全一致
完整实现代码
import numpy as np def rgb_to_xyz(input_arr): """ RGB转CIE XYZ色彩空间,计算逻辑与tfio版本完全对齐 参数: input_arr: 3维(`[H, W, 3]`)或4维(`[N, H, W, 3]`)numpy浮点数组 返回: 同维度、同dtype的XYZ色彩空间数组 """ # 输入dtype校验,对齐tfio规则 assert input_arr.dtype in (np.float16, np.float32, np.float64) # 转换矩阵完全复用tfio硬编码值,dtype与输入保持一致 kernel = np.array( [ [0.412453, 0.357580, 0.180423], [0.212671, 0.715160, 0.072169], [0.019334, 0.119193, 0.950227], ], dtype=input_arr.dtype ) # sRGB线性化计算,阈值、公式完全对齐tfio实现 linearized = np.where( input_arr > 0.04045, np.power((input_arr + 0.055) / 1.055, 2.4), input_arr / 12.92, ) # 通道维度线性变换,等价于tf.tensordot(value, tf.transpose(kernel), axes=((-1,), (0,))) return linearized @ kernel.T
之前skimage版本精度不匹配的原因
skimage内置的
rgb2xyz使用的sRGB gamma校正参数、XYZ转换矩阵数值和tfio的硬编码实现存在细微差异,因此无法做到逐元素结果完全一致。上述实现完全复用tfio的固定参数,不存在该偏差,浮点计算误差仅来自不同计算框架的底层精度差,通常在1e-7量级以内,可视为精度完全匹配。
内容的提问来源于stack exchange,提问作者AlirezaTomari
相关产品推荐
相关产品推荐

