颜色 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 转换(您无法从矩阵中获得)。
在原始图像处理中,您通常使用两个 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 转换(您无法从矩阵中获得)。