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

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...