【发布时间】: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