将观察者/光源的 CIE-XYZ 颜色调整为另一种

问题描述 投票:0回答:2

如何将具有特定观察者和光源的

CIE 1931 XYZ
颜色空间中定义的颜色调整为另一个观察者和光源?

假设我有一个颜色

c
,它是使用
D65 Illuminant
2° observer
定义的,其中

c = (x: 44.6609, y: 76.106, z: 12.3365)

如何将

c
转换为
Illuminant D50
10° observer

D65光源2°观察者的白点为:

95.047, 100, 108.883

D50光源以10°观察者的白点为:

96.720, 100, 81.427

这个问题类似于将给定观察者/光源的光谱数据转换为另一个观察者/光源,但我对适应背后的数学特别感兴趣。

我正在寻找的是一组方程(或矩阵,如果有的话),它允许我从一个光源/观察者到另一个光源/观察者调整颜色。

如果算法/实现能够演示其背后的数学原理,也是可以接受的。

algorithm colors photo color-space
2个回答
1
投票

不存在从观察者到另一个观察者的标准转换。

可以提出一种将观察者映射到另一个观察者的转换,但这并不是微不足道的,并且只有在相同程度的观察者之间才有意义,例如CIE 1931 2 度标准观察员到 CIE 2015 2 度标准观察员。

另一种替代方法是对颜色样本进行光谱恢复(或上采样)以生成同色异谱,并在新观察者下将其重新集成到 CIE XYZ 三刺激值。这将引入无法量化的误差,因为您没有颜色样本的原始光谱反射率。

如果您考虑所有 RGB 颜色空间,例如sRGB、DCI-P3,这些没有光谱定义,你可以想象这是一个大问题。

但是,可以在同一观察者下在不同光源之间进行转换。


0
投票

考虑到https://www.nixsensor.com/free-color-converter/中进行的转换,我使用http://www.brucelindbloom.com/“数学”>中提供的方法获得了接近的值“色彩适应”。将 xyz 从 D65/2° 转换为 C/10° 的一些示例:

[0.4348 0.4837 0.0815] 从 D65/2° 到 C/10°

代码如下:[0.4451 0.4837 0.0869] NIX 转换器:[0.4410 0.4823 0.0857]

[0 1 1] 从 D65/2° 到 C/10°

代码如下:[0 1.0000 1.0667] NIX 转换器:[0,0151 0,9914 1,0637]

当使用最大可能值(白点)时,结果非常接近:

[0.95047 1 1.08883] 从 D65/2° 到 C/10°

代码如下:[0.9729 1.0000 1.1615] NIX 转换器:[0.9728 1.0000 1.1615]

Matlab/Octave 代码:

clear all

%white D65/2° from: White points of standard illuminants - https://en.wikipedia.org/wiki/Standard_illuminant
x=0.31272;y=0.32903;
z = 1.0 - x - y;
Y = 1;
X = (Y / y) * x;
Z = (Y / y) * z;
ils=[X Y Z];

%white C/10° from: White points of standard illuminants - https://en.wikipedia.org/wiki/Standard_illuminant
x=0.31039;y=0.31905;
z = 1.0 - x - y;
Y = 1;
X = (Y / y) * x;
Z = (Y / y) * z;
ild=[X Y Z];

%using XYZ Scaling
ma=[1 0 0
    0 1 0
    0 0 1];

s=ils*ma; %Bruce Justin Lindbloom Eq 3
d=ild*ma; %Bruce Justin Lindbloom Eq 4

M=inv(ma)*[diag(d./s)]*ma; %Bruce Justin Lindbloom Eq 2

xyz=[0.4348 0.4837 0.0815];% from xyz - D65/2°

%xyz - C/10°
new_xyz=xyz*M   % Bruce Justin Lindbloom Eq 1
© www.soinside.com 2019 - 2024. All rights reserved.