颜色 space 转换的矩阵乘法

Matrix multiplication for color space conversion

在原始图像处理中,您通常使用两个 3x3 矩阵进行两种颜色 space 转换:rgb2xyz 和 xyz2camera。

然后您可以通过以下两个矩阵乘法之一得到 rgb2camera: (1) rgb2camera = (rgb2xyz)(xyz2camera) 要么: (2) rgb2camera = (xyz2camera)(rgb2xyz)

然后通过反转 rgb2camera 矩阵得到 camera2rgb。

但是,矩阵乘法不可交换,因此 (1) 和 (2) 给出不同的结果。我在各种在线文章中都看到了这两种方法,但哪种方法正确?对我来说,(1) 看起来是正确的(数学上),但 (2) 似乎为我的示例图像提供了更正确的图像(视觉上)。

从数学上讲,如果您先乘以 A,然后再乘以 B,则正确的组合矩阵是 BA,而不是 AB。他们以相反的顺序进行。您可以将此视为始终将向量放在最后,这样看起来合乎逻辑。所以第二个应该是正确的。

如果更改 xyz2camera 的参数,则可以同时使用这两个顺序。另一方面,变量名也有语义值,你的变量名好像是"strange"。通常你从相机特定颜色 space 转换为众所周知的颜色 space,所以使用 camera2xyz.

会更正常

如果我们考虑语义有效变量名,情况 2 是正确的:

rgb2camera = (xyz2camera)(rgb2xyz)

让我们从右往左走。我们假设(根据名称)我们正在将 RGB 向量(sRGB?)转换为 RGB_camera,我们称它为 LMS 只是为了好玩(LMS 实际上只是眼睛反应,而不是相机传感器),并且您想要 RGB(未明确指定).

  L                     R                              R
[ S ] =  rgb2camera * [ G ] = xyz2camera * rgb2xyz * [ G ]
  M                     B                              B

您的变量名意味着:

  X                  R
[ Y ] =  rgb2xyz * [ G ]
  Z                  B

所以你有

  L                    X
[ S ] = xyz2camera * [ Y ]
  M                    Z

所以你有期望值:

  L                    R
[ S ] = rgb2camera * [ G ]
  M                    B

这意味着 rgb2camera = (xyz2camera)(rgb2xyz) 如您的第二个等式。

您应该始终从右向左解释此类乘法。在末尾添加一个虚拟向量,并在每个步骤上注释您拥有的颜色 space(这将是下一次乘法的输入)。所以你会少犯错误。

注:相机传感器通常为RGB形式(几乎所有的传感器上方都有R、G、B滤镜)。但是你需要先de-mosaic,把R,G,B线性化[他们没有伽马校正,但是他们有自己的校正函数]。

注意:校准软件通常在 LUT3D 的形式上为您提供更好的功能,因此 non-linear 转换(您无法从矩阵中获得)。