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

标签 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?它从哪里获得该值?

抱歉,如果这些真的是愚蠢的问题,我正在努力解决这个问题。

最佳答案

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

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

关于c# - 澄清 ColorMatrix 转换的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5096285/

相关文章:

c# - 如何在不下载内容的情况下执行 GET 请求?

c# - .net 和 Java 迁移等效表

c++ - Windows GDI+ 应用程序中的奇怪显示错误

c# - 如何使用 GDI+ 更改图像的背景颜色?

c# - 我如何使用 .NET ColorMatrix 更改颜色?

c# - Entity Framework 在没有标识列的表上不起作用

c# - Asp.Net 应用程序数据库连接问题

c# - nHibernate 中的 Save() 和 SaveOrUpdate() 有什么区别

.net - IBM Data Server Client v9.7fp5 的日期时间字段溢出

.net - .Net 前景色的调色板引用?