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(可选)** - 它是返回图像的数据类型(默认为 float)

示例

在下面的示例中,我们使用 mh.colors.rgb2xyz() 函数将 RGB 图像转换为 XYZ 图像:

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('tree.tiff')
# Converting it to XYZ
xyz_image = mh.colors.rgb2xyz(image)
# Create a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original RGB image
axes[0].imshow(image)
axes[0].set_title('RGB Image')
axes[0].set_axis_off()
# Displaying the XYZ image
axes[1].imshow(xyz_image)
axes[1].set_title('XYZ Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

以下是上述代码的输出:

RGB XYZ Image

使用转换矩阵

我们可以用来将 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
# Function to convert RGB to 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):
         # Separating the RGB image into individual channels
         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
# Loading the image
image = mh.imread('tree.tiff')
# Converting it to XYZ
xyz_image = rgb_to_xyz(image)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original RGB image
axes[0].imshow(image)
axes[0].set_title('RGB Image')
axes[0].set_axis_off()
# Displaying the XYZ image
axes[1].imshow(xyz_image)
axes[1].set_title('XYZ Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

上述代码的输出如下:

RGB XYZ Image1
广告