澄清ColorMatrix转换的工作原理

Jon*_*ter 7 .net c# 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]
Run Code Online (Sandbox Code Playgroud)

我知道-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
Run Code Online (Sandbox Code Playgroud)

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

对不起,如果这些是非常愚蠢的问题,我正试图让这个问题失败.

Dan*_*röm 3

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

((247/255) * -1 + 1) * 255 = 8
or
247 * -1 + 255 = 8
Run Code Online (Sandbox Code Playgroud)