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

问题描述 投票:1回答:2

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

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

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

colors rgb probability-density
2个回答
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 (int)(value * 255)

但是,如果您希望值表示bin的中位数,则可以使用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  

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

如果您正在进行正确和准确的科学计算(例如插值,聚类等),我建议使用Median Bins,否则将float转换为int更快,更适合快速图形操作。


0
投票

要获得正确的结果,你必须将它乘以255.(999 ...),然后将其置于int,否则你将在1/4 1/2和3/4等关键点得到错误的值。 。 - 您不能包含减法器,因为这会导致x值接近0的负值。之前的答案只是简单地通过上限返回顶部值,然后返回x = 1附近的错误结果...

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

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

© www.soinside.com 2019 - 2024. All rights reserved.