3

我有一个 (R, G, B) 三元组,其中每种颜色介于 0.0 和 1.0 之间。给定因子 F(0.0 表示原始颜色,1.0 表示白色),我想计算一个新的三元组,即颜色的“水印”版本。

我使用以下表达式(伪代码):

for each c in R, G, B:
    new_c ← c + F × (1 - c)

这会产生一些看起来不错的东西,但我知道这会导致颜色色调出现偏差(在转换之前和之后检查 HSV 等效项),我不知道这是否可以预期。

是否有“标准”(带或不带引号)算法来计算颜色的“水印”版本?如果是,那是什么?如果不是,你能告诉我其他有什么相同效果的算法吗?

4

2 回答 2

3

实际上,这看起来应该给出正确的色调,减去算术舍入误差的微小变化。

这当然是合理的,简单的实现了水印效果。我不知道任何其他“标准”的,有几种方法可以做到。

替代方案是:
与白色混合,但在 F 上非线性进行,例如new_c = c + sqrt(F)*(1-c),或者您可以使用其他非线性函数 - 它可能有助于水印看起来或多或少“平坦”。

您可以通过执行以下操作更有效地执行此操作(其中 F 取范围 0..INF):

new_c = 1 - (1-c)/pow(2, F)

对于实际像素值(0..255),这将转换为:

new_c = 255 - (255-c)>>F

这不仅在整数算术中相当快,而且您可以并行处理 32b 整数。

于 2010-10-26T14:33:26.537 回答
0

为什么不只是?

new_c = F*c

我认为您应该首先检查水印像素并确定它应该更暗还是更亮。

对于打火机,公式可能是 new_c=1-F*(c-1)

于 2010-10-26T14:33:01.743 回答