Graphics 在线性RGB空间与非线性RGB空间中使用颜色时,实际差异是什么?

Graphics 在线性RGB空间与非线性RGB空间中使用颜色时,实际差异是什么?,graphics,colors,rgb,color-space,color-coding,Graphics,Colors,Rgb,Color Space,Color Coding,线性RGB空间的基本性质是什么?非线性RGB空间的基本性质是什么?当谈到8位(或更多)中每个通道内的值时,会有什么变化 在OpenGL中,颜色是3+1的值,我指的是RGB+alpha,每个通道保留8位,这是我得到的清晰部分 但是说到伽马校正,我不知道在非线性RGB空间中工作的效果是什么 因为我知道如何在图形软件中使用曲线进行照片编辑,所以我的解释是,在线性RGB空间中,您可以按原样获取值,无需进行任何操作,也无需附加数学函数,相反,当它是非线性时,每个通道通常会按照经典的幂函数行为演化 即使我把

线性RGB空间的基本性质是什么?非线性RGB空间的基本性质是什么?当谈到8位(或更多)中每个通道内的值时,会有什么变化

在OpenGL中,颜色是3+1的值,我指的是RGB+alpha,每个通道保留8位,这是我得到的清晰部分

但是说到伽马校正,我不知道在非线性RGB空间中工作的效果是什么

因为我知道如何在图形软件中使用曲线进行照片编辑,所以我的解释是,在线性RGB空间中,您可以按原样获取值,无需进行任何操作,也无需附加数学函数,相反,当它是非线性时,每个通道通常会按照经典的幂函数行为演化

即使我把这个解释当作真实的解释,我仍然不知道真实的线性空间是什么,因为在计算之后,所有的非线性RGB空间都变成了线性,最重要的是,我没有得到非线性颜色空间更适合人眼的部分,因为最终所有的RGB空间都是线性的,就我的理解而言。

我不是“人类颜色检测专家”,但是我在YUV->RGB转换中遇到了类似的事情。R/G/B通道有不同的权重,因此如果按x更改源颜色,RGB值将更改不同的数量

如前所述,我不是专家,无论如何,我认为,如果你想做一些颜色校正转换,你应该在YUV空间中做,然后将其转换为RGB(或者在RGB上做数学上等价的操作,小心数据丢失)。另外,我不确定YUV是否是最好的本地颜色表示,但摄像机提供了这种格式,这就是我遇到的问题


这是一个神奇的YUV->RGB公式,其中包含了秘密数字:

假设您使用的是RGB颜色:每种颜色用三种强度或亮度表示。您必须在“线性RGB”和“sRGB”之间进行选择。现在,我们将通过忽略三种不同的强度来简化事情,并假设只有一种强度:也就是说,只处理灰色的阴影

在线性颜色空间中,存储的数字与其表示的强度之间的关系是线性的。实际上,这意味着如果将数字加倍,强度(灰色的亮度)就会加倍。如果要将两个强度相加(因为您是基于两个光源的贡献计算强度,或者因为您是在不透明对象上添加透明对象),可以通过将两个数字相加来实现如果您正在进行任何类型的2D混合或3D着色,或几乎任何图像处理,那么您希望强度在线性颜色空间中,因此您可以只添加、减去、乘和除数字,以对强度产生相同的效果。大多数颜色处理和渲染算法仅在使用线性RGB时提供正确的结果,除非向所有内容添加额外的权重

听起来很容易,但有个问题。人眼对光的敏感度在低强度下比在高强度下更高。也就是说,如果你列出所有你能分辨的强度,黑暗的比光明的多。换一种说法,你可以比用浅色的灰色更好地分辨出深色的灰色。特别是,如果您使用8位来表示强度,并且在线性颜色空间中执行此操作,那么最终将得到太多的明暗色调,而没有足够的暗色调。你在你的黑暗区域得到带状,而在你的光明区域,你在用户无法区分的不同深浅的近白色上浪费了一点

为了避免这个问题,并充分利用这8位,我们倾向于使用sRGB。sRGB标准告诉您要使用曲线,以使颜色非线性。曲线底部较浅,因此可以有更多的深灰色,顶部较陡,因此浅灰色较少。如果你把这个数字翻一倍,你的强度就会翻一倍以上。这意味着,如果将sRGB颜色添加到一起,最终得到的结果将比应该的颜色更亮。现在,大多数显示器将其输入颜色解释为sRGB。因此,当您在屏幕上放置颜色,或将其存储在每通道8位的纹理中时,请将其存储为sRGB,以便充分利用这8位

您会注意到我们现在遇到了一个问题:我们希望在线性空间中处理颜色,但存储在sRGB中。这意味着您将在读取时执行sRGB到线性转换,在写入时执行线性到sRGB转换。正如我们已经说过的那样,线性8位强度没有足够的暗色,这会导致问题,因此还有一条更实用的规则:如果可以避免,请不要使用8位线性颜色。遵循8位颜色始终是sRGB的规则已成为惯例,因此您可以在将强度从8位扩大到16位或从整数扩大到浮点的同时进行sRGB到线性转换;类似地,当您完成浮点处理后,在转换为sRGB的同时,您可以缩小到8位。如果你遵循这些规则,你就不必担心伽马校正

读取sRGB图像时,如果需要线性强度,请将以下公式应用于每个强度:

float s = read_channel();
float linear;
if (s <= 0.04045) linear = s / 12.92;
else linear = pow((s + 0.055) / 1.055, 2.4);
float linear = do_processing();
float s;
if (linear <= 0.0031308) s = linear * 12.92;
else s = 1.055 * pow(linear, 1.0/2.4) - 0.055; ( Edited: The previous version is -0.55 )
float s=read_channel();
浮动线性;

如果(在实践中,您可以指定线性或标准RGB作为SVG中的颜色空间,我不知道效果如何,除了这一点似乎很重要外:-)@MichaelMullany这个线性的东西看起来更像是给用户的一个提示,而不是一个真正独特的品质。这对我很有帮助:我想是一位数学老师告诉我“当你听到线性时思考线”。不确定这是否有帮助,但对我来说,这是一个“哦