2010-10-26 51 views
3

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

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

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

这产生一些看起来okayish,但我明白这引入了偏差的颜色的色相(之前和之后的检查HSV等效转型),我不知道这是否是预期的。

是否有一个“标准”(带或不带引号)算法来计算“水印”版本的颜色?如果是,那是哪个?如果不是,你可以告诉我什么其他算法达到同样的效果?

回答

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整数中并行执行。

+0

您是否知道:我的算法与在初始颜色上使用不透明度F混合白色相同?因为那是另一种选择,但我认为它是一样的。无论如何,如果你确实知道其他方式来做到这一点,请更新你的答案。谢谢。 – tzot 2010-10-26 14:57:10

+0

是的,您的方式与混合白色与不透明F完全相同。 – andrewmu 2010-10-26 15:13:07

0

为什么不只是?

new_c = F*c 

我认为你应该先去水印像素,并找出它应该是更暗还是更亮。

对于较轻的公式可以是 new_c = 1-F *(C-1)

+1

对于F = 1.0,这不会产生白色 – andrewmu 2010-10-26 14:34:44

+0

对于F = 0.0,第一个公式为变暗,第二个变得更浅 – 2010-10-27 06:47:54

+0

F == 0.0在第二个公式中产生白色(这与我公式除了'c-1'应该是'1-c'),但是我确定在所有可能的三元组的第一个公式中没有单个F产生白色。无论如何,我是具体的:0.0原始颜色,1.0白色。不管怎么说,还是要谢谢你。 – tzot 2010-10-27 18:30:29