c# – 澄清ColorMatrix转换的工作原理

我正在做一些关于图像处理应用程序的工作(为了好玩),我正在努力完全理解ColorMatrix转换的工作原理.我得到线性/仿射变换的基础知识,并且可以通过在线复制示例得到很好的结果,但我想完全理解为什么有些东西可以工作而不仅仅是满足它的工作原理.

例如,对图像进行简单转换以产生其负值(每种颜色转换为其各自的互补)使用以下矩阵:

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

我知道-1是180度的余弦,这是将一种颜色“翻转”到它的互补所需的旋转,但我不明白的是颜色向量如何与上面的矩阵相乘并产生正确的互补向量.

例如,如果像素的颜色矢量为[247,255,1](使用RGBAW空间),则对上述矩阵进行乘法会产生[-247,-255,1],但这是不正确的,因为上面的实际互补色是[8,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?它从哪里获得价值?

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

解决方法

你知道最底线是翻译.汉斯在评论中说的是,涉及的缩放因子为255,这可能让你感到困惑.一种看待这种情况的方法是首先将所有ARGB值除以255,然后应用矩阵乘法,然后将所有值乘以255以得到正确的ARGB值.另一种看待它的方法是将转换值视为255大.您将以两种方式获得相同的结果.
((247/255) * -1 + 1) * 255 = 8
or
247 * -1 + 255 = 8

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...