【问题标题】:Clarification about how ColorMatrix transformations work关于 ColorMatrix 转换如何工作的说明
【发布时间】:2011-10-20 19:30:48
【问题描述】:

我正在开发一个图像处理应用程序(为了好玩),并且正在努力完全理解 ColorMatrix 转换的工作原理。我掌握了线性/仿射变换的基础知识,并且可以通过在线复制示例来解决问题,但我想完全掌握为什么某些东西有效,而不是仅仅满足于它有效。 p>

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

[-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?它从哪里得到这个值?

对不起,如果这些问题真的很愚蠢,我正在努力解决这个问题。

【问题讨论】:

  • 您忘记了最后一行的 1-s。它们被添加(缩放 255)。 255 + -247 = 8。
  • 真的吗?我以为底行是平移而不是缩放?
  • 我不明白为什么这会起作用,因为实际的矩阵代数不会产生 8。ColorMatrix 类是否对矩阵中的某些位应用了特殊规则?

标签: c# .net gdi+ colormatrix


【解决方案1】:

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

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

【讨论】:

  • 这种缩放是否恰好将值保持在 0 和 1 之间?
  • 另一个问题:为什么我的帖子中的第二个矩阵(通过编辑添加)也有效?第四行也翻译吗?
  • 1) 是的。 2)它将alpha通道的值乘以1。并且由于您的alpha通道(在这种情况下)是255,因此您碰巧得到了相同的行为。 :-)
  • 啊,我明白了。非常感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多