【问题标题】:Matrix multiplication for color space conversion色彩空间转换的矩阵乘法
【发布时间】:2019-11-28 02:24:29
【问题描述】:

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

然后您可以通过以下两个矩阵乘法中的任何一个获得 rgb2camera: (1) rgb2camera = (rgb2xyz)(xyz2camera) 要么: (2) rgb2camera = (xyz2camera)(rgb2xyz)

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

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

【问题讨论】:

    标签: image-processing color-space


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您更改 xyz2camera 的参数,您可以同时使用这两个命令。另一方面,变量名也有语义价值,你的变量名看起来很“奇怪”。通常你会从相机特定的色彩空间转换为众所周知的色彩空间,所以使用 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) 在你的第二个等式中。

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

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

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

      【讨论】:

      • 我同意,术语 xyz2camera 很奇怪,但这是 DNG 文件(ColorMatrix1 和 ColorMatrix2)的元数据中提供的矩阵。你真的想要camera2xyz。