2

假设我在 Luv 颜色空间中有三个坐标。确定这些对应于真实颜色的最佳方法是什么?

4

2 回答 2

2

假设您的 L* 在域 [0, 100] 中,您可以构建可见光谱的边界,然后确定您的 CIE L*u*v* 坐标是否在其中。

import colour
import numpy as np


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, interpolator=colour.LinearInterpolator).align(
                colour.DEFAULT_SPECTRAL_SHAPE)
        XYZ.append(colour.spectral_to_XYZ(spd))

    return np.array(XYZ).reshape(len(XYZ), -1, 3)

mesh = XYZ_outer_surface(43).reshape((-1, 3))

E = colour.ILLUMINANTS['CIE 1931 2 Degree Standard Observer']['E']

XYZ1 = colour.Luv_to_XYZ([50, 50, 50], E)
print(colour.is_within_mesh_volume(XYZ1, mesh))
# True

XYZ2 = colour.Luv_to_XYZ([50, 250, -250], E)
print(colour.is_within_mesh_volume(XYZ2, mesh))
# False

我强烈建议缓存网格,因为它的计算量很大。

于 2018-05-16T10:48:47.117 回答
0

你有Lu'v'坐标。您可能需要检查L和限制允许值。通常我们不允许L大于L白色,但现实(和旧的电视标准)允许它,只是在小时期或小表面(否则它将成为新的白色,因为眼睛适应)。

第一步:将其转换为 XYZ(或任何三色坐标)。维基百科在https://en.wikipedia.org/wiki/CIELUV#The_reverse_transformation中有一个公式,但请注意这是针对特定范围和特定u伽马校正的。v

然后根据例如https://en.wikipedia.org/wiki/LMS_color_space将其转换为 LMS 颜色空间

最后:检查LM、 和S是否为正(LMS 颜色空间的 L、M、S:注意LLUV 不同L,本例代表Long cone type)。

如果 LMS 坐标为正,则颜色真实可见。在另一种情况下,不可能产生这样的光。

LSM 代表 L、M 和 S 视锥类型的视锥响应,因此它是颜色可见度的明确答案。问题是:很难测量单眼锥反应。因此,您会看到 XYZ 和 LMS 之间的各种转换矩阵。另一方面,结果是相似的。注意:由于直接测量的困难,矩阵也间接导出(使用类似于 Kel 答案的方法,但不仅仅是表面)。

于 2018-05-17T06:29:08.047 回答