Mahotas - RGB 到 XYZ 的转换
XYZ 颜色空间是一种三维颜色模型,基于人类感知,表示该颜色的亮度、颜色和强度。
在 XYZ 颜色空间中 −
- Y 分量表示颜色的亮度。
- X 和 Z 分量确定色度坐标或颜色在色谱中的位置。
- 通过组合不同的 X、Y 和 Z 值,任何可见颜色都可以在 XYZ 颜色空间中表示。
当我们从 RGB 转换为 XYZ 时,我们会获取颜色的红色、绿色和蓝色值,并将它们更改为称为 XYZ 的不同值。这有助于我们将颜色信息与它在特定显示器或设备上的显示细节区分开来。
Mahotas 中的 RGB 到 XYZ 转换
在 Mahotas 中,我们可以使用 colors.rgb2xyz() 函数将 RGB 图像转换为 XYZ 图像。
Mahotas 中的 RGB 到 XYZ 转换涉及以下步骤 −
标准化 RGB 值 − 将像素的 RGB 值(通常表示为 0 到 255 之间的整数)标准化为 0 到 1 之间的标准化范围。
此步骤可确保 RGB 值一致且可比较。
伽马校正 −在从 RGB 转换为 XYZ 之前,Mahotas 会对 RGB 值应用伽马校正。
伽马校正可调整图像的亮度级别,确保生成的 XYZ 值更准确地表示原始颜色。
线性化 RGB 值 − 伽马校正后,RGB 值将转换为线性颜色空间。在此线性 RGB 颜色空间中,强度值与实际物理光强度成比例。
此线性变换可实现更准确的颜色计算。
转换矩阵 − Mahotas 使用转换矩阵将线性 RGB 值转换为 XYZ 值。转换矩阵表示 RGB 和 XYZ 颜色空间之间的关系。
它包含确定每个颜色通道对最终 XYZ 值的贡献量的系数。
输出 − 应用转换矩阵后,Mahotas 提供 XYZ 值作为输出。这些 XYZ 值表示输入 RGB 图像在颜色空间中的颜色,该颜色空间在感知上更加统一,更接近人类视觉系统感知颜色的方式
使用 mahotas.colors.rgb2xyz() 函数
mahotas.colors.rgb2xyz() 函数将 RGB 图像作为输入,并返回该图像的 XYZ 颜色空间版本。
生成的 XYZ 图像保留了原始 RGB 图像的结构和内容。
语法
以下是 mahotas − 中 rgb2xyz() 函数的基本语法
mahotas.colors.rgb2xyz(rgb, dtype={float})
其中,
rgb − 它是 RGB 颜色空间中的输入图像。
dtype(可选) − 它是返回图像的数据类型(默认为浮点型)
示例
在下面的示例中,我们使用 mh.colors.rgb2xyz() 函数将 RGB 图像转换为 XYZ 图像 −
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('tree.tiff') # 将其转换为 XYZ xyz_image = mh.colors.rgb2xyz(image) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始 RGB 图像 axes[0].imshow(image) axes[0].set_title('RGB Image') axes[0].set_axis_off() # 显示 XYZ 图像 axes[1].imshow(xyz_image) axes[1].set_title('XYZ Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
以下是上述代码的输出−

使用转换矩阵
我们可以使用另一种方法来将 RGB 图像转换为 XYZ 图像,即使用转换矩阵。转换矩阵由将像素的 RGB 分量与 XYZ 分量相关联的系数组成。
每个像素的 XYZ 分量值可以按如下方式计算 −
X = 0.412456 * r + 0.357576 * g + 0.180437 * b Y = 0.212672 * r + 0.715152 * g + 0.072175 * b Z = 0.019334 * r + 0.119193 * g + 0.950471 * b
其中 X、Y 和 Z 值表示 XYZ 颜色空间中的相应值。
示例
以下示例显示使用 RGB 通道的转换矩阵值 − 将 RGB 图像转换为 XYZ 图像
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 将 RGB 转换为 XYZ 的函数 def rgb_to_xyz(rgb): height, width, _ = rgb.shape xyz_image = np.zeros((height, width, 3)) for i in range(height): for j in range(width): # 将 RGB 图像分离为各个通道 r, g, b = rgb[i, j] x = 0.412456 * r + 0.357576 * g + 0.180437 * b y = 0.212672 * r + 0.715152 * g + 0.072175 * b z = 0.019334 * r + 0.119193 * g + 0.950471 * b xyz_image[i, j] = [x, y, z] return xyz_image # 加载图像 image = mh.imread('tree.tiff') # 将其转换为 XYZ xyz_image = rgb_to_xyz(image) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始 RGB 图像 axes[0].imshow(image) axes[0].set_title('RGB Image') axes[0].set_axis_off() # 显示 XYZ 图像 axes[1].imshow(xyz_image) axes[1].set_title('XYZ Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
上述代码的输出如下−
