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中的转换涉及以下步骤:
-
Normalize the XYZ values -对X、Y和Z值进行归一化,使其介于0和1之间。此步骤确保XYZ值相对于参考白点,并允许进行一致的颜色计算。
-
Convert normalized XYZ to linear RGB - 接下来,使用转换矩阵将标准化 XYZ 值转换为线性 RGB 值。转换矩阵指定了 XYZ 坐标如何促成了最终颜色的红、绿和蓝分量。进行矩阵乘法以获得线性 RGB 值。
-
Apply gamma correction - Gamma 校正调整 RGB 值的亮度,使其与人类视觉系统的响应匹配。
-
Scale the RGB values - 在进行 Gamma 校正后,RGB 值通常在 0 至 1 之间。为在 8 位范围内 (0-255) 表示颜色,您需要调整 RGB 值的比例。将经过 Gamma 校正的每个 RGB 值乘以 255,以将其调整至适当的比例。
-
Result - 在应用比例缩放后,您已获得 RGB 颜色值。这些值表示最终颜色的红、绿和蓝通道的强度。
Using the mahotas.colors.xyz2rgb() Function
mahotas.colors.xyz2rgb() 函数采用 XYZ 图像作为输入,并返回图像的 RGB 颜色空间版本。
最终得到的 RGB 图像保留了原始 XYZ 图像的结构和内容,但会丢失一些色彩细节。
以下是 mahotas 中 xyz2rgb() 函数的基本语法 -
mahotas.colors.xyz2rgb(xyz, dtype={float})
其中,
-
xyz - 它是 XYZ 颜色空间中的输入图像。
-
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()
以下是上面代码的输出: -
Using Transformation Matrix
我们可以使用变换矩阵将 XYZ 图像转换为 RGB 图像。变换矩阵有一组用于将 XYZ 像素转换为 RGB 像素的值。
-
通过在变换矩阵和 XYZ 图像之间进行矩阵乘法来将 XYZ 像素转换为 RGB 像素。
-
我们通过使用 numpy 库中的 dot() 函数来实现这一目的。
-
然后,通过乘以 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()
上述代码的输出如下: