提问人:JMC 提问时间:11/1/2023 最后编辑:JMC 更新时间:11/1/2023 访问量:46
在 L*a*b* 空间中线性插值会产生负 RGB 值?RGB 在 L*a*b* 中的嵌入是非凸的吗?
Linearly interpolating in L*a*b* space yields negative RGB values? Is RGB's embedding within L*a*b* non-convex?
问:
我正在尝试在CIELAB空间中的颜色之间线性插值,并在线性RGB空间中检索颜色。
我的工作流程如下:
- 在线性 RGB 中取 2 种颜色,比如 (1,0,0) 和 (0,0,1)。
- 将它们转换为 XYZ 空间。我正在使用这个矩阵。这应该是带有 E 白点的 RGB 矩阵。
- 使用以下公式将它们转换为 L*a*b*: 维基百科。对于 Xn、Yn、Zn,我使用 RGB(1,1,1) 的相应 XYZ 坐标,对于这个矩阵,它是 (1,1,1)。因此,坐标被缩放,使白点的 Y 为 1.0。
- 在这两者之间按分量线性插值 L*a*b* 元素。
- 通过反转将插值点转换为 RGB 上述过程(使用来自维基百科的逆变换,以及 XYZ->RGB 的逆矩阵。
问题是,这些中间颜色在我的RGB空间之外,尽管我显然从里面的2种颜色开始。具体来说:在RGB(1,0,0)和RGB(0,0,1)之间插值时,G通道获得的负值约为-0.058。
如果我使用原色和白点,即线性sRGB的矩阵,则会出现同样的问题。
这正常吗?在我看来,L*a*b* 颜色空间可能是这样的,因此无法保证两种 RGB 可表示颜色之间的直线也在该可表示区域内。如果它不正常,错误可能在哪里?如果是正常的,我应该如何处理?
我的代码:
import numpy as np
mat = np.array([[0.49,0.31,0.2],[0.17697,0.81240,0.01063],[0.,0.01,0.99]])
def RGB_to_Lab(R,G,B):
X,Y,Z = (mat@[[R],[G],[B]])[:,0]
Xn, Yn, Zn = (mat@[[1],[1],[1]])[:,0]
f = lambda t: t**(1/3) if t>(6/29)**3 else (1/3)*(29/6)**2*t+4/29
L = 116*f(Y/Yn) - 16
a = 500*(f(X/Xn)-f(Y/Yn))
b = 200*(f(Y/Yn)-f(Z/Zn))
return L, a, b
def Lab_to_RGB(L,a,b):
f = lambda t:t**3 if t>6/29 else 3*(6/29)**2*(t-4/29)
Xn, Yn, Zn = (mat@[[1],[1],[1]])[:,0]
X = Xn*f((L+16)/116+a/500)
Y = Yn*f((L+16)/116)
Z = Zn*f((L+16)/116-b/200)
R,G,B = (np.linalg.inv(mat)@[[X],[Y], [Z]])[:,0]
return R,G,B
def steps(n):
Lab = np.array(RGB_to_Lab(1,0,0))
Lab2 = np.array(RGB_to_Lab(0,0,1))
for i in range(n+1):
r = i/n
tmp = r*Lab2+(1-r)*Lab
print(Lab_to_RGB(*tmp))
答:
1赞
Kel Solaar
11/1/2023
#1
CIE Lab 受可见光谱(即标准观察者对光的敏感度)的限制,因此在该空间中插值可能会产生负 RGB 值,因为几乎没有任何 RGB 色彩空间(例如 sRGB)覆盖其全部。
对于凸性问题,RGB空间在CIE Lab中不是凸的:
sRGB的
ITU-R BT.2020
ACES2065-1
评论
0赞
JMC
11/1/2023
我知道空间自然会比 RGB 空间大得多,但是,我想我假设在可表示范围内的现有 RGB 值之间插值时不会发生这种情况。我想我真正的问题是:将 (s)RGB 的图像/嵌入到 CIE L中是b* 空间凸吗?
0赞
Kel Solaar
11/1/2023
在CIE Lab中,RGB空间不是凸的,我添加了一些图片来证明这一点。
0赞
Giacomo Catenazzi
11/1/2023
迂腐模式:RGB颜色模型可以描述所有颜色,但正如op发现的那样,某些颜色用负数(或超光明值)描述。CIE RGB 具有这样的负值,因此为了简化计算(在我们发明通用计算机之前),CIE 创建了 CIE XYZ(只是一个线性变换,所以相同的 odel)。关于凸性?这取决于指标。线性插值颜色的含义是什么?(CIE xy 可用于颜色混合,但 RGB 的插值没有有意义的值,AFAIK)。
0赞
JMC
11/1/2023
@GiacomoCatenazzi线性插值是指两个 Lab* 坐标之间的分量线性插值。
评论