在 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?

提问人:JMC 提问时间:11/1/2023 最后编辑:JMC 更新时间:11/1/2023 访问量:46

问:

我正在尝试在CIELAB空间中的颜色之间线性插值,并在线性RGB空间中检索颜色。

我的工作流程如下:

  1. 在线性 RGB 中取 2 种颜色,比如 (1,0,0) 和 (0,0,1)。
  2. 将它们转换为 XYZ 空间。我正在使用这个矩阵。这应该是带有 E 白点的 RGB 矩阵。
  3. 使用以下公式将它们转换为 L*a*b*: 维基百科。对于 Xn、Yn、Zn,我使用 RGB(1,1,1) 的相应 XYZ 坐标,对于这个矩阵,它是 (1,1,1)。因此,坐标被缩放,使白点的 Y 为 1.0。
  4. 在这两者之间按分量线性插值 L*a*b* 元素。
  5. 通过反转将插值点转换为 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))
python rgb 颜色空间 cielab

评论


答:

1赞 Kel Solaar 11/1/2023 #1

CIE Lab 受可见光谱(即标准观察者对光的敏感度)的限制,因此在该空间中插值可能会产生负 RGB 值,因为几乎没有任何 RGB 色彩空间(例如 sRGB)覆盖其全部。

对于凸性问题,RGB空间在CIE Lab中不是凸的:

sRGB的

sRGB - CIE Lab sRGB - CIE Lab

ITU-R BT.2020

ITU-R BT.2020 - CIE Lab

ACES2065-1

ACES2065-1 - CIE Lab

评论

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* 坐标之间的分量线性插值。