从传感器到屏幕,从 RAW 到 JPEG,从直线到曲线

💡 原文中文,约17300字,阅读约需42分钟。
📝

内容提要

文章梳理从传感器到屏幕的色彩管线:传感器线性记录光子,而人眼感知非线性,因此需要各类曲线。显示gamma源于CRT物理特性,恰好近似人眼感知;Log曲线源自胶片浓度,用于压缩动态范围;tone mapping决定场景光如何映射到屏幕,涉及审美选择;显示编码如sRGB、PQ、HLG规定码值与光的关系;LUT可承载上述任意曲线。核心是区分编码与渲染。

🔎

延伸解读

线性存储的代价:为什么 RAW 需要 14-bit

文章用 Poynton 的推导说明:在 100:1 场景对比度下,若要求相邻码值亮度差不超过 1%,线性编码需要约 9900 个码值,即 14-bit;而感知均匀的非线性编码只需约 463 个码值,即 9-bit。14-bit 线性 RAW 的上半部分全部用于最亮一档曝光,到第 10 档只剩 16 个码值。这解释了 RAW 位深为何偏高:不是浪费,而是线性记录光子的必然结果。

显示 gamma 的行业惯性:LCD/OLED 仍在模拟 CRT

CRT 的亮度与电压呈约 2.5 次幂关系,摄像机端用约 0.45 次幂补偿,恰好近似人眼感知的倒数,形成感知均匀编码。LCD 和 OLED 的物理响应与 CRT 不同,但驱动电路仍被设计成模拟 gamma 响应,因为整个影像生态——从 BT.709 到 JPEG/H.264/HEVC,再到操作系统 ICC——都假设显示端施加近似 V^2.2 的非线性。若出现物理线性的屏幕,现存图片会显示异常。

tone mapping 的审美选择与色相风险

tone mapping 决定场景光如何映射到屏幕光,涉及高光 roll-off、黑点、中间调斜率等审美决定,没有唯一答案。文章指出,若将同一条曲线分别套在 R、G、B 三个通道上,亮而饱和的颜色会因通道压缩比例不一致而改变色相;只对亮度套曲线并保持 RGB 比例,又可能导致通道超出显示色域。ACES 2 改用感知空间 JMh,只压明度、保留色相,OKLab 则被用于解决 HSL/CIELAB 的感知不均匀问题。

区分编码与渲染:gamma、Log、tone curve 各司其职

文章强调,gamma 是编码,把线性光映射成码值,由标准规定且编解码必须互逆;tone mapping 是渲染,把场景光映射成显示光,是审美或工程选择。Log 是 scene-referred 编码,只负责把场景光装进容器,不负责好看。LUT 本身不是某一站曲线,而是打表插值手段,可以承载显示编码、Log 转换、tone curve 或完整 3D 色彩变换。理解管线位置和目的,比记住曲线名称更重要。

❓

Q&A

为什么相机RAW文件通常是12或14位,而JPEG只有8位?

因为传感器线性记录光子,人眼感知却近似对数。线性编码下,同样感知质量需要约14位;而经过gamma类非线性编码后,只需约9位就能达到相同效果。RAW保留线性数据以便后期,JPEG则用非线性编码高效存储。

显示gamma和Log曲线到底有什么区别?

显示gamma是编码曲线,把线性光映射成码值,目的是高效存储和传输,由标准规定且编解码必须互逆。Log曲线也是编码,但它把场景光装进一个更均匀的容器,不负责显示好看。两者都是曲线,但目的和处理管线位置不同。

tone mapping和gamma校正是一回事吗?

不是。gamma是编码,是坐标变换,由标准规定,编解码互逆;tone mapping是渲染,决定场景光如何映射到屏幕光,涉及高光滚降、黑点、中间调斜率等审美选择,没有唯一答案。两者都可以用曲线或LUT实现,但目的不同。

为什么在sRGB码值上直接做平均或模糊会导致画面变暗?

因为码值不是光。sRGB码值0.5解码回线性光只有约0.214,即白的21%。直接平均码值等于按错误比例混合光,结果比正确值暗约1.2档。正确做法是先解码到线性光,运算后再编码回去。

ACES 2在tone mapping时如何避免颜色偏移?

ACES 1直接在RGB各通道上套同一条曲线,亮而饱和的颜色各通道压缩比例不一致,导致色相改变。ACES 2换到感知空间JMh,只压明度J,视彩度M另行处理,色相h原样保留,从而避免色相偏移。

LUT能用来做什么?它和曲线是什么关系?

LUT是打表插值优化曲线计算的手段,可以承载文章中的任意曲线乃至组合。1D LUT是一条曲线,常用于显示编码、Log转换或tone curve;3D LUT是三输入三输出的向量函数,常用于跨通道色彩变换。Log还常作为LUT的Shaper,按感知均匀重新分配节点。

🏷️

标签

➡️

继续阅读