关于ColorMatrix转换如何工作的说明

问题描述:

我正在做一些关于图像处理应用程序的工作(为了好玩),并且正在努力完全理解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是180degrees的余弦,这是将颜色“翻转”为互补所需的旋转,但我不明白的是颜色矢量如何与上述矩阵相乘并产生正确的互补矢量。例如,如果像素具有[247,255,0,255,1](使用RGBAW空间)的颜色矢量,则对上述矩阵执行乘法运算产生[-247,-255,0,...,255] 255,1],但这是不正确的,因为上面的实际互补色是[8,0,255,255,1]。

我错过了一些很明显的东西,很高兴承认我不完全确定我在做什么:)被转换的颜色矢量是否代表其他坐标系? (例如不是0-255)

如果有人可以帮助提供我的理解“缺失的环节”,我会非常感激。

编辑

我才发现,原来下面的矩阵也适用,实际上是mathemtically直观(它产生正确的矢量)。

-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。 – 2011-02-23 20:14:34

+0

真的吗?我认为最后一行是翻译不是缩放? – 2011-02-23 20:27:55

+0

我不明白为什么会这样,因为实际的矩阵代数不会产生8.是否ColorMatrix类将特殊规则应用于矩阵中的某些位? – 2011-02-23 20:37:11

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

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

这种缩放是否会将值保持在0和1之间? – 2011-02-24 11:44:28

+0

另一个问题:为什么我的文章中的第二个矩阵(通过编辑添加)也可以工作?第4行是否也进行翻译? – 2011-02-24 12:12:13

+0

1)是的。 2)它将alpha通道的值乘以1。而且由于你的alpha通道(在这种情况下)是255,所以你碰巧得到了相同的行为。 :-) – 2011-02-24 12:44:40