可见色域是如何界定的?
How is the visible gamut bounded?
CIE XYZ 中颜色的坐标 space 代表我们眼睛中每种视锥细胞类型的刺激 - 因此 三刺激值 。并非所有坐标 (x, y, z)
都有意义(例如,您不能在任何视锥细胞中进行负刺激),因此 XYZ space 中所有可能组合的域将是一个斑点。有时您会发现描绘的是 blob,例如 on Wikipedia:
(斑点上的颜色相当无意义,因为它们实际上无法在标准 RGB 显示器上显示。)
我现在问自己为什么这个 blob 是有界的。我不能只选择 blob 中的任何点 (x, y, z)
并用 alpha*(x,y,z,)
缩放它,就像我打开光源一样,并且仍然在可见的 space 中吗?这里的上限究竟是什么?
上下文定义
您的维基百科图像中描述的外表面代表由颜色匹配函数 (CMFS) 限定的体积。 CMFS 是 defined by the CIE as follows:
tristimulus values of monochromatic stimuli of equal radiant power
CIE 系统中等辐射功率光源的另一个名称是等能量或 E。
CIE XYZ 三刺激值本身 defined by the CIE:
amounts of the 3 reference colour stimuli, in a given trichromatic system, required to match the colour of the stimulus considered
这与 Colour Matching Experiments from Maxwell and Wright and Guild (1931) 直接相关,可能不在本回答的范围内。
外表面生成
外表面可能是使用方波光谱功率分布 (SPD) 构建的,即等能量光源的切片。 Bruce Lindbloom 对 this page.
有解释
方法是将不同带宽的方波SPD转换为CIE XYZ三刺激值,这将形成外表面。
假设有 5 个垃圾箱,第一组 SPD 将是这样的:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
第二个:
1 1 0 0 0
0 1 1 0 0
0 0 1 1 0
0 0 0 1 1
1 0 0 0 1
第三个:
1 1 1 0 0
0 1 1 1 0
0 0 1 1 1
1 0 0 1 1
1 1 0 0 1
等...
这里是使用 Colour 生成外表面点的 Python 片段:
import colour
import numpy as np
class NearestNeighbourInterpolator(colour.KernelInterpolator):
def __init__(self, *args, **kwargs):
kwargs['kernel'] = colour.kernel_nearest_neighbour
super(NearestNeighbourInterpolator, self).__init__(*args, **kwargs)
def generate_square_waves(samples):
square_waves = []
square_waves_basis = np.tril(np.ones((samples, samples)))[0:-1, :]
for i in range(samples):
square_waves.append(np.roll(square_waves_basis, i))
return np.vstack((np.zeros(samples), np.vstack(square_waves),
np.ones(samples)))
def XYZ_outer_surface(samples):
XYZ = []
wavelengths = np.linspace(colour.DEFAULT_SPECTRAL_SHAPE.start,
colour.DEFAULT_SPECTRAL_SHAPE.end, samples)
for wave in generate_square_waves(samples):
spd = colour.SpectralPowerDistribution(
wave, wavelengths).align(
colour.DEFAULT_SPECTRAL_SHAPE,
interpolator=NearestNeighbourInterpolator)
XYZ.append(colour.spectral_to_XYZ(spd))
return np.array(XYZ).reshape(len(XYZ), -1, 3)
# 43 is picked as number of samples to have integer wavelengths.
colour.write_image(XYZ_outer_surface(43), 'CIE_XYZ_outer_surface.exr')
并且输出:
CIE XYZ 中颜色的坐标 space 代表我们眼睛中每种视锥细胞类型的刺激 - 因此 三刺激值 。并非所有坐标 (x, y, z)
都有意义(例如,您不能在任何视锥细胞中进行负刺激),因此 XYZ space 中所有可能组合的域将是一个斑点。有时您会发现描绘的是 blob,例如 on Wikipedia:
(斑点上的颜色相当无意义,因为它们实际上无法在标准 RGB 显示器上显示。)
我现在问自己为什么这个 blob 是有界的。我不能只选择 blob 中的任何点 (x, y, z)
并用 alpha*(x,y,z,)
缩放它,就像我打开光源一样,并且仍然在可见的 space 中吗?这里的上限究竟是什么?
上下文定义
您的维基百科图像中描述的外表面代表由颜色匹配函数 (CMFS) 限定的体积。 CMFS 是 defined by the CIE as follows:
tristimulus values of monochromatic stimuli of equal radiant power
CIE 系统中等辐射功率光源的另一个名称是等能量或 E。
CIE XYZ 三刺激值本身 defined by the CIE:
amounts of the 3 reference colour stimuli, in a given trichromatic system, required to match the colour of the stimulus considered
这与 Colour Matching Experiments from Maxwell and Wright and Guild (1931) 直接相关,可能不在本回答的范围内。
外表面生成
外表面可能是使用方波光谱功率分布 (SPD) 构建的,即等能量光源的切片。 Bruce Lindbloom 对 this page.
有解释方法是将不同带宽的方波SPD转换为CIE XYZ三刺激值,这将形成外表面。
假设有 5 个垃圾箱,第一组 SPD 将是这样的:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
第二个:
1 1 0 0 0
0 1 1 0 0
0 0 1 1 0
0 0 0 1 1
1 0 0 0 1
第三个:
1 1 1 0 0
0 1 1 1 0
0 0 1 1 1
1 0 0 1 1
1 1 0 0 1
等...
这里是使用 Colour 生成外表面点的 Python 片段:
import colour
import numpy as np
class NearestNeighbourInterpolator(colour.KernelInterpolator):
def __init__(self, *args, **kwargs):
kwargs['kernel'] = colour.kernel_nearest_neighbour
super(NearestNeighbourInterpolator, self).__init__(*args, **kwargs)
def generate_square_waves(samples):
square_waves = []
square_waves_basis = np.tril(np.ones((samples, samples)))[0:-1, :]
for i in range(samples):
square_waves.append(np.roll(square_waves_basis, i))
return np.vstack((np.zeros(samples), np.vstack(square_waves),
np.ones(samples)))
def XYZ_outer_surface(samples):
XYZ = []
wavelengths = np.linspace(colour.DEFAULT_SPECTRAL_SHAPE.start,
colour.DEFAULT_SPECTRAL_SHAPE.end, samples)
for wave in generate_square_waves(samples):
spd = colour.SpectralPowerDistribution(
wave, wavelengths).align(
colour.DEFAULT_SPECTRAL_SHAPE,
interpolator=NearestNeighbourInterpolator)
XYZ.append(colour.spectral_to_XYZ(spd))
return np.array(XYZ).reshape(len(XYZ), -1, 3)
# 43 is picked as number of samples to have integer wavelengths.
colour.write_image(XYZ_outer_surface(43), 'CIE_XYZ_outer_surface.exr')
并且输出: