假设我在Luv颜色空间中有三个坐标。确定这些颜色与真实颜色相对应的最佳方法是什么?
答案 0 :(得分:1)
假设您的L *在域[0,100]中,您可以construct the boundaries of the Visible Spectrum然后确定您的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
我强烈建议缓存网格,因为计算量非常大。
答案 1 :(得分:1)
您有Lu'v'
个坐标。您可能需要检查L
并限制允许的值。通常我们不允许L
大于L
白色,但现实(和旧的电视标准)允许它,仅适用于小周期或小表面(否则它将成为新的白色,因为眼睛适应)。
第一步:将其转换为XYZ(或任何三刺激坐标)。维基百科有https://en.wikipedia.org/wiki/CIELUV#The_reverse_transformation中的一个公式,但请注意这是针对一个特定的u
和v
范围以及特定的 gamma 更正。
然后根据例如将其转换为LMS色彩空间https://en.wikipedia.org/wiki/LMS_color_space
最后:检查L
,M
和S
是否为正(L,M,S的LMS颜色空间:注意L
不相同{{ 1}} LUV,在这种情况下,它代表 L ong cone类型。)
如果LMS坐标为正,则颜色是真实且可见的。在另一种情况下,不可能产生这样的光。
LSM代表L,M和S锥形类型的眼锥响应,因此它是颜色可见性的明确答案。问题是:很难测量单眼锥反应。因此,您会看到XYZ和LMS之间的各种转换矩阵。另一方面,结果是相似的。注意:由于难以直接测量,间接得到的矩阵(使用类似于Kel的方法回答,但不仅仅是表面)。