关于ColorMatrix转换的工作原理的澄清

7

我正在为一个图像处理应用程序(娱乐)做一些工作,但是我还没有完全理解ColorMatrix变换的原理。我了解线性/仿射变换的基础知识,并且可以通过在线示例进行复制来完成工作,但我希望完全掌握为什么某些东西有效,而不仅仅满足于它的实现。

例如,对图像进行简单的转换以生成其反色(每种颜色都转换为其相应的互补色)使用以下矩阵:

[-1, 0, 0, 0, 0]
[0, -1, 0, 0, 0]
[0, 0, -1, 0, 0]
[0, 0, 0, 1, 0]
[1, 1, 1, 0, 1]

我知道-1是180度余弦值,这是将颜色“翻转”到其互补色所需的旋转,但我不明白的是,如何将颜色向量乘以上述矩阵并产生正确的互补向量。
例如,如果像素具有[247, 255, 0, 255, 1]的颜色向量(使用RGBAW空间),对上述矩阵执行乘法会产生[-247,-255,0,255,1],但那不正确,因为上述的真正互补颜色是[8,0,255,255,1]。
我在这里缺少一些显而易见的东西,并且很高兴承认我不完全确定自己在做什么 :)颜色向量被变换表示在其他坐标系中吗? (例如不是0-255)
如果有人能帮助提供我理解的“缺失链接”,我将非常感激。
编辑
我刚刚发现以下矩阵也有效,并且实际上在数学上很直观(它产生了正确的向量)。
-1  0  0  0  0
 0 -1  0  0  0
 0  0 -1  0  0
 1  1  1  1  0
 0  0  0  0  1

我的新问题是:为什么这两个矩阵都能起作用?后者提供了更令人满意的解决方案,因为我可以从代数的角度理解它为什么有效。四行是否用于缩放?如果是,为什么缩放会增加255?它从哪里获取该值?

如果这些问题很愚蠢,请原谅,我正在努力掌握它。


2
你忘记了底行中的1-s。它们会被相加(乘以255的比例尺)。255 + -247 = 8。 - Hans Passant
真的吗?我以为底部行是用于翻译而不是缩放的? - Jonathan Carter
我不明白为什么这会起作用,因为实际的矩阵代数不会产生8。ColorMatrix类是否将矩阵中的某些位应用于特殊规则? - Jonathan Carter
1个回答

3

您是正确的,底线是翻译。 Hans 在他的评论中说的是有一个缩放因子 255 参与其中,这可能是让您感到困惑的原因。一种看待这个问题的方法是,所有 ARGB 值首先被除以 255,然后应用矩阵乘法,然后所有值都被乘回 255,以给出正确的 ARGB 值。另一种方法是将翻译值视为 255 大。无论哪种方式,您都会得到相同的结果。

((247/255) * -1 + 1) * 255 = 8
or
247 * -1 + 255 = 8

这种缩放是为了保持值在0和1之间吗? - Jonathan Carter
另外一个问题:为什么我在帖子中添加的第二个矩阵也能起作用?第四行也进行了平移吗? - Jonathan Carter
  1. 是的。
  2. 它将 alpha 通道的值乘以 1 并加上。由于您的 alpha 通道是(在此情况下)255,因此您恰好获得相同的行为。 :-)
- Dan Byström

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接