RGB颜色从​​0-1到0-255转换 - 强度概率分布

时间:2018-02-20 13:32:47

标签: colors rgb probability-density

我想知道,如果我(以及互联网上和我工作过的公司中的每个人)都以错误的方式转换颜色。显然,当我想将0-255范围内的颜色转换为0-1时,我只需将值除以255,对吧?当我想走另一条路时,我会成倍增加。

但这是对的吗?想象一下,我的颜色是一些数学的结果(就像双线性插值一样简单,或者像你想要的那样简单(或者敢)。然后这可能不是最好的方法。从某个角度看,当从浮点转换时0-1到整数0-255,我想将间隔分成256块相同大小的 ,然后进行"查找"。如果我只乘以255( rgb values to 0 to 1 scale)和圆形,"块"或" bins"对于0和255将只是其他的一半大小。即颜色强度的概率分布赢得& #39;是正确的。

我不认为这在实践中经常是一个问题。例如。在高端VFX中,总是使用浮点颜色(0-1加上超级黑/超白)并且仅作为最后一步转换为0-255。尽管如此,它仍然困扰着我。什么是正确的答案?

2 个答案:

答案 0 :(得分:1)

不一定是这种情况,请使用2位量化(4个级别)将其可视化:

如果我们将其除以4(相当于8位中的256)

0.00 to 0.24 = Black  
0.25 to 0.49 = Dark Gray  
0.50 to 0.74 = Light Gray  
0.75 to 0.99 = White  

您会注意到,垃圾箱被均分(大小为0.25),如果我们乘以256,一切都会正确。除了1.0之外,它将映射为256。我们可以通过将值限制在0到255之间来解决此问题。

if (value > 255) {
    value = 255
}

但是如果我们想简化计算并避免钳位,可以将其除以3(相当于8位中的255)

0.000 to 0.333 = Black  
0.334 to 0.666 = Dark Gray  
0.667 to 0.999 = Light Gray  
1.000 to 1.333 = White  

常见的误解是最后一个bin(纯白色)仅映射为奇异值1.0,但事实并非如此,它一直扩展到:

4/3     = 1.33333 for 2 bits
256/255 = 1.00392 for 8 bits

对于数学计算,将1.0到1.00392视为纯白色,将0到0.00392视为纯黑色,并且所有垃圾箱的大小均应相同(0.00392)。

注意:如果使用这种表示法,则使用Math.round(value * 255)是错误的!
它将导致显示错误的颜色,并且所有垃圾箱将向左移动其一半大小。
您应该使用Math.floor(value * 255),甚至应该直接转换为整数(int)(value * 255)

但是,如果您希望这些值代表垃圾箱的中位数,则可以使用Math.round()。但是,新的垃圾箱将是:

-0.166 to 0.166 = Black  
 0.167 to 0.500 = Dark Gray  
 0.501 to 0.833 = Light Gray  
 0.834 to 1.166 = White  

只需选择一种表示形式并坚持使用即可。如果您在代码中使用不同的表示形式,请确保进行适当的转换。

如果您要进行正确而准确的科学计算(例如,插值,聚类等),我建议使用中值箱,否则将浮点数转换为int会更快,并且更适合于快速图形操作。

答案 1 :(得分:0)

要获得正确的结果,必须将其乘以255.(999 ...),然后将其取整为int,否则您将在1/4 1/2和3/4的关键点获得错误的值等等...-您不能包含减法器,因为这将导致x接近0值时出现负值。 先前的答案只是简单地将最高值限制为上限,然后返回的值将导致x = 1 ...附近的错误结果。

这是我发现可以正常工作的最简单答案...问候

积分:https://forum.arduino.cc/index.php?topic=78108.msg590057#msg590057