在原始图像处理中,通常使用两个3x3矩阵进行两个色彩空间转换:rgb2xyz和xyz2camera。
然后可以通过以下两个矩阵乘法之一获得rgb2camera: (1)rgb2camera =(rgb2xyz)(xyz2camera) 要么: (2)rgb2camera =(xyz2camera)(rgb2xyz)
然后通过反转rgb2camera矩阵来获取camera2rgb。
但是,矩阵乘法不是可交换的,因此(1)和(2)给出不同的结果。我在各种在线文章中都看到了这两种方法,但是哪个正确?对我来说,(1)在数学上看起来是正确的,但是(2)似乎在视觉上给出了我所拥有的示例图像的更正确的图像。
答案 0 :(得分:2)
在数学上,如果先乘以A,然后乘以B,则正确的组合矩阵为BA,而不是AB。它们以相反的顺序进行。您可以考虑将向量始终放在最后,因此看起来很合逻辑。所以第二个应该是正确的。
答案 1 :(得分:0)
如果您更改 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)
就像您的第二个方程式一样。
您应该始终从右向左解释这种乘法。 Add在末尾添加一个虚拟矢量,并在每个步骤上注释您拥有的色彩空间(它将作为下一个乘法的输入)。这样您将减少错误。
注意:相机传感器通常采用RGB形式(几乎每个传感器上方都有R,G,B滤镜)。但是,您需要先进行消马赛克,并将R,G,B线性化(它们没有经过伽马校正,但是它们具有自己的校正功能)。
注意:校准软件通常以LUT3D形式为您提供更好的功能,因此可以进行非线性转换(无法从矩阵获得)。