每个程序员都应该了解的伽马校正
What every coder should know about Gamma Correction

原始链接: https://blog.johnnovak.net/2016/09/21/what-every-coder-should-know-about-gamma/

本文指出软件开发中一个常被忽视的关键问题:对“伽马校正”的处理不当。大多数数字图像为了节省空间,采用模拟人类非线性视觉感知的 sRGB(伽马编码)格式存储。然而,标准的图像处理算法(如缩放、模糊和合成)在数学设计上是基于“线性”光强进行运算的。 当开发者直接对伽马编码的数据运行这些算法时,会产生物理上不准确的结果,例如渐变错误、Alpha 混合失真、CGI 渲染呈现“塑料感”以及色彩偏差。由于人类视觉是非线性的,sRGB 文件中的 50% 灰度值并不等于 50% 的光强,而仅相当于约 22%。 为实现“伽马正确”的视觉效果,开发者必须: 1. 在处理前将图像“解码”到线性空间。 2. 在此“线性空间”中执行各项运算。 3. 将结果“重新编码”回 sRGB 以便显示。 尽管这在图形领域至关重要,但许多专业工具和库仍忽略了伽马校正。作者呼吁程序员采用“线性工作流”,以确保所有数字媒体呈现出的视觉效果均符合物理规律且保持一致。

这篇 Hacker News 讨论帖探讨了数字系统中伽马校正和色彩表示的细微差别。 讨论首先明确指出,RGB 数值并不总是与光输出呈线性关系,这种关系取决于所使用的特定色彩空间。虽然线性空间旨在使数值与光强度之间建立直接对应关系,但大多数面向显示的色彩空间(如 sRGB)都是非线性的。 讨论中提出的一个关键点是,“0”并不总是代表没有光。有用户指出,在许多视频格式(例如 MPEG-2 中使用的 8-bit YUV)中,亮度(luma)的有效范围被限制在 16 到 235 之间。在这些系统中,黑色由数值 16 而非 0 来表示。这种“余量”(headroom 和 footroom)在历史上是为了适应模拟信号数字化以及防止处理过程中的数据截断而设置的。
相关文章

原文

联系我们 contact @ memedata.com