澄清ColorMatrix转换的工作原理

时间:2011-02-23 19:52:07

标签: c# .net gdi+ colormatrix

我在图像处理应用程序上做了一些工作(为了好玩),我正在努力完全理解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?从哪里获得这个价值?

很抱歉,如果这些都是非常愚蠢的问题,我正试图将其解决。

1 个答案:

答案 0 :(得分:3)

你认为最底线是翻译。汉斯在评论中说的是,涉及的缩放因子为255,这可能让你感到困惑。一种看待这种情况的方法是首先将所有ARGB值除以255,然后应用矩阵乘法,然后将所有值乘以255以得到正确的ARGB值。另一种看待它的方法是将翻译值视为255。您将以两种方式获得相同的结果。

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