Mahotas - XYZ 到 RGB 颜色空间转换



在上一个教程中,我们学习了 XYZ 颜色空间、RGB 颜色空间以及 RGB 到 XYZ 的转换。现在让我们讨论一下 XYZ 颜色空间到 RGB 颜色空间的转换。

当我们将 XYZ 转换为 RGB 时,我们采用颜色的 XYZ 值(表示其感知特性),并将它们转换为红色、绿色和蓝色值。

这种转换允许我们将颜色表示为适合在特定设备或屏幕上显示的格式。

Mahotas 中的 XYZ 到 RGB 转换

在 Mahotas 中,我们可以使用 **colors.xyz2rgb()** 函数将 XYZ 图像转换为 RGB 图像。

Mahotas 中的 XYZ 到 RGB 转换涉及以下步骤:

  • **归一化 XYZ 值** - 归一化 X、Y 和 Z 值,使其范围在 0 到 1 之间。此步骤确保 XYZ 值相对于参考白点,并允许进行一致的颜色计算。

  • **将归一化的 XYZ 转换为线性 RGB** - 接下来,使用转换矩阵将归一化的 XYZ 值转换为线性 RGB 值。转换矩阵指定 XYZ 坐标如何影响结果颜色的红色、绿色和蓝色分量。

    进行矩阵乘法运算以获得线性 RGB 值。

  • **应用伽马校正** - 伽马校正调整 RGB 值的亮度,以匹配人类视觉系统的响应。

  • **缩放 RGB 值** - 伽马校正后,RGB 值通常在 0 到 1 的范围内。为了在 8 位范围内 (0-255) 表示颜色,需要缩放 RGB 值。

    将每个伽马校正后的 RGB 值乘以 255 以将其缩放至适当的范围。

  • **结果** - 应用缩放后,即可获得 RGB 颜色值。这些值表示结果颜色的红色、绿色和蓝色通道的强度。

使用 mahotas.colors.xyz2rgb() 函数

mahotas.colors.xyz2rgb() 函数接收 XYZ 图像作为输入,并返回图像的 RGB 颜色空间版本。

生成的 RGB 图像保留了原始 XYZ 图像的结构和内容,但是会丢失一些颜色细节。

语法

以下是 mahotas 中 xyz2rgb() 函数的基本语法:

mahotas.colors.xyz2rgb(xyz, dtype={float})

其中:

  • **xyz** - 它是 XYZ 颜色空间中的输入图像。

  • **dtype (可选)** - 它是返回图像的数据类型(默认为浮点数)。

示例

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

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

以下是上述代码的输出:

XYZ RGB Conversion

使用转换矩阵

我们可以使用转换矩阵将 XYZ 图像转换为 RGB 图像。转换矩阵具有一组用于将 XYZ 像素转换为 RGB 像素的值。

  • 通过进行转换矩阵与 XYZ 图像之间的矩阵乘法,将 XYZ 像素转换为 RGB 像素。
  • 我们通过使用 numpy 库中的 dot() 函数来实现这一点。
  • 然后,通过将每个像素的值乘以 255,再除以该像素的最大强度,将每个像素的值从 0 到 1 的范围(XYZ 颜色的强度范围)归一化到 0 到 255 的范围(RGB 颜色的强度范围),以获得 RGB 图像。

示例

以下示例显示了使用转换矩阵将 XYZ 图像转换为 RGB 图像:

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Function to convert XYZ to RGB
def xyz_to_rgb(xyz_image):
   # XYZ to RGB conversion matrix
   xyz_to_rgb_matrix = np.array([[3.2406, -1.5372, -0.4986],
   [-0.9689, 1.8758, 0.0415],[0.0557, -0.2040, 1.0570]])
   # Perform the XYZ to RGB conversion using matrix multiplication
   rgb_image = np.dot(xyz_image, xyz_to_rgb_matrix.T)
   # Scale the RGB values from the range [0, 1] to [0, 255]
   rgb_image = (rgb_image * 255.0 / np.max(rgb_image)).astype(np.uint8)
   return rgb_image
# Loading the image
image = mh.imread('tree.tiff')
# Converting it to XYZ
xyz_image = mh.colors.rgb2xyz(image)
# Converting back to RGB (lossy)
rgb_image = xyz_to_rgb(xyz_image)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original XYZ image
axes[0].imshow(xyz_image)
axes[0].set_title('XYZ Image')
axes[0].set_axis_off()
# Displaying the RGB image
axes[1].imshow(rgb_image)
axes[1].set_title('RGB Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

上述代码的输出如下:

XYZ RGB Conversion1
广告