071、Gamma 校正:从线性空间到非线性空间的映射曲线与暗部和亮部分配
一、一个让我熬夜三天的Bug
去年做某款旗舰机的前置摄像头调试,客户反馈暗光自拍人脸“发灰”,像是蒙了一层雾。我盯着波形图看了两小时,RAW域数据明明正常,RGB直方图也没问题,但sRGB输出就是不对劲。最后发现是ISP pipeline里Gamma LUT加载顺序搞反了——线性数据先被Gamma压缩,然后才做CCM,导致色彩矩阵作用在了非线性空间上。这个坑让我意识到,Gamma校正远不止“拉曲线”那么简单。
二、Gamma的物理本质:人眼不是线性传感器
人眼对亮度的感知遵循韦伯-费希纳定律,对暗部变化极其敏感,对亮部变化相对迟钝。如果摄像头直接输出线性光强(比如0-4095的12bit RAW),在8bit显示器上你会看到:暗部细节挤在几个灰度级里,亮部却浪费了大量码字。这就是为什么需要Gamma编码——把有限的码字分配给视觉更敏感的区域。
数学上,标准Gamma曲线是:
V_out = V_in ^ (1/γ)消费电子领域γ通常取2.2。注意这个指数是倒数——编码时用1/2.2≈0.454,解码时用2.2。很多新手搞反,结果画面要么死黑要么死白。
三、ISP Pipeline里的Gamma位置:别放错地方
在典型的移动ISP流程中,Gamma校正通常放在:<