Mahotas 简明教程

Mahotas - XYZ to RGB Conversion

我们在前面的教程中学习了XYZ颜色空间、RGB颜色空间以及XYZ到RGB的转换。现在我们来讨论XYZ颜色空间到RGB颜色空间的转换。

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

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

XYZ to RGB Conversion in Mahotas

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

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

  1. Normalize the XYZ values -对X、Y和Z值进行归一化,使其介于0和1之间。此步骤确保XYZ值相对于参考白点,并允许进行一致的颜色计算。

  2. Convert normalized XYZ to linear RGB - 接下来,使用转换矩阵将标准化 XYZ 值转换为线性 RGB 值。转换矩阵指定了 XYZ 坐标如何促成了最终颜色的红、绿和蓝分量。进行矩阵乘法以获得线性 RGB 值。

  3. Apply gamma correction - Gamma 校正调整 RGB 值的亮度,使其与人类视觉系统的响应匹配。

  4. Scale the RGB values - 在进行 Gamma 校正后,RGB 值通常在 0 至 1 之间。为在 8 位范围内 (0-255) 表示颜色,您需要调整 RGB 值的比例。将经过 Gamma 校正的每个 RGB 值乘以 255,以将其调整至适当的比例。

  5. Result - 在应用比例缩放后,您已获得 RGB 颜色值。这些值表示最终颜色的红、绿和蓝通道的强度。

Using the mahotas.colors.xyz2rgb() Function

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

最终得到的 RGB 图像保留了原始 XYZ 图像的结构和内容,但会丢失一些色彩细节。

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

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

其中,

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

  2. dtype (optional) − 是返回图像的数据类型(默认为 float)。

在以下示例中,我们使用 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

Using Transformation Matrix

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

  1. 通过在变换矩阵和 XYZ 图像之间进行矩阵乘法来将 XYZ 像素转换为 RGB 像素。

  2. 我们通过使用 numpy 库中的 dot() 函数来实现这一目的。

  3. 然后,通过乘以 255,再除以该像素的最大强度,将每个像素的值从 0 到 1 的范围(XYZ 颜色的强度范围)归一化为 0 到 255 的范围(RGB 颜色的强度范围),以获取 RGB 图像。

Example

以下示例显示了如何使用变换矩阵将 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