Image processing 颜色空间转换中的矩阵乘法

Image processing 颜色空间转换中的矩阵乘法,image-processing,color-space,Image Processing,Color Space,在原始图像处理中,通常使用两个3x3矩阵进行两次颜色空间转换:rgb2xyz和xyz2camera 然后,您可以通过以下两种矩阵乘法之一获得rgb2camera: (1) RGB2摄像机=(rgb2xyz)(xyz2camera) 或: (2) RGB2摄像机=(xyz2camera)(rgb2xyz) 然后通过反转rgb2camera矩阵得到camera2rgb 然而,矩阵乘法是不可交换的,所以(1)和(2)给出了不同的结果。我在各种在线文章中看到了这两种方法,但哪一种是正确的?对我来说,(1

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

然后,您可以通过以下两种矩阵乘法之一获得rgb2camera: (1) RGB2摄像机=(rgb2xyz)(xyz2camera) 或: (2) RGB2摄像机=(xyz2camera)(rgb2xyz)

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


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

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

如果更改xyz2camera的参数,则可以同时使用这两种顺序。另一方面,变量名也有一个语义值,您的变量名看起来“奇怪”。通常情况下,您可以将特定于相机的颜色空间转换为众所周知的颜色空间,因此使用camera2xyz更为正常

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

rgb2camera = (xyz2camera)(rgb2xyz)
让我们从右向左走。我们假设(从名称)我们正在将RGB矢量(sRGB?)转换为RGB_相机,我们称之为LMS只是为了好玩(LMS实际上只是眼睛响应,而不是相机传感器),并且您想要RGB(没有很好地指定)

变量名意味着:

  X                  R
[ Y ] =  rgb2xyz * [ G ]
  Z                  B
你有吗

  L                    X
[ S ] = xyz2camera * [ Y ]
  M                    Z
所以你得到了期望值:

  L                    R
[ S ] = rgb2camera * [ G ]
  M                    B
这意味着
rgb2camera=(xyz2camera)(rgb2xyz)
如第二个等式所示

你应该总是从右到左解释这种乘法。在最后添加一个虚拟向量,并在每一步上注释您拥有的颜色空间(这将是下一次乘法的输入)。所以你会犯更少的错误

注:摄像机传感器通常采用RGB形式(几乎所有传感器的上方都有R、G、B滤光片)。但是你需要先去马赛克,然后线性化R,G,B[它们不是伽马校正的,但是它们有自己的校正函数]


注:校准软件通常以LUT3D的形式为您提供更好的功能,因此非线性变换(无法从矩阵中获得)。

我同意,术语xyz2camera很奇怪,但这是DNG文件元数据中提供的矩阵(ColorMatrix1和ColorMatrix2)。你真的想要camera2xyz。
  L                    R
[ S ] = rgb2camera * [ G ]
  M                    B