RGB

RGB灯光修正

Gamma、LUT

Views:  times Updated on January 20, 2026 Posted by elmagnifico on January 20, 2026

Foreword

RGB或者RGBW类似的多通道光源数据校准流程总结一下,之前一直把各种修正混在一起,实际上每个阶段都应该只做各自阶段的事情,混入别的东西就会导致最终输出跑偏

RGB光源

一般来说是两层进行处理,先处理感官层面的数据,此时不带有任何物理上的修正,这是我们理想的颜色应该有的样子,而后才是将这个理论值输出到现实中时需要处理的修正

感官层

Gamma

感官层修正是比较简单的,把Gamma应用上去就行了

img

人眼对亮度的感知是非线性的,所以要通过Gamma进行修正,一般选取标准 Gamma值:2.2(sRGB)或 2.4(Rec.709)

# Gamma校正公式
def gamma_correct(value, gamma=2.2):
    if value <= 0.04045:
        return value / 12.92
    else:
        return ((value + 0.055) / 1.055) ** gamma
    
# 或者简化的幂函数(适用于某些场景)
def gamma_correct_simple(value, gamma=2.2):
    return value ** (1.0 / gamma)

前者分段函数是为了更好地处理精度问题,保证函数连续可导,这几个值基本都是经验值,用于高亮和低亮的区分点。

value输入的就是亮度,不是简单的RGB,所以感官层最好使用的数据是HSL,而不是RGB,更符合感官计算的流程

物理层

Gamma计算后的数据要输出到物理层时,需要计算各种校正数据,比如温度、比如通道本身的色偏和光强差异,此时就要把HSL转换成RGB这种方式输出给物理器件

3D LUT

LUT主要是处理光源本身的偏移和不对齐的情况,实际是RGB输出,所以是3D,如果有更多颜色通道可能是4D、5D、6D等

简单说就是真实输出,然后反向测量输出的RGB到底是多少,从而得到一张大映射表,如果全量采样,花费的时间就太长了,所以一般都是精简采样,4×4×4(粗校准)、16×16×16(4096个采样点)、32×32×32、64×64×64(高精度),然后采样点插值一般使用三线性,直接取输入点周围的八个顶点,然后按比例插值即可。

但是这个测量其实也非常困难,因为本身光源就受到温度影响,你亮1s和亮0.5s测量的结果都是不一样的,所以要做好控制变量,对于测量环境的要求非常高。

当测量完LUT就得到了这个光源的颜色空间,对于非显示器这种级别,大部分点光源的色谱空间可能都有比较大的缺陷,某些颜色是无法还原的

温漂

在测量LUT时需要严格控制温度(因为温度会影响测量结果),但实际使用时还会遇到温漂的问题,因为三个RGB通道,可能输出功率不同,热量分布不均匀,而输出灯光本身受温度影响的偏移又非常明显,这就还需要单独测量温漂曲线,看每个通道与温漂的关系。

一般来说温度不会混到和LUT一起测量,多一个维度会导致LUT表爆炸(变成4D、5D等),温漂都是基于单通道进行测量,看每个通道在对应的温度下,输出的光强变化的情况,拟合成一个二次曲线或者映射表进行使用。实际使用时,通常是在应用LUT之后再根据当前温度应用温漂修正。

混光

混光的问题,这里只是单独提出来说一下,实际上混光是硬件本身的物理特性,光会溢出激活旁边的通道。如果LUT是在完整测量了实际输出(包含混光效果)的基础上建立的,那混光的影响就已经被包含在LUT里了。但有时候混光可能会单独处理:一般情况下单通道输出的时候,颜色并不纯粹,光会溢出激活旁边的通道,所以单通道里往往都混了一部分其他通道的颜色,特别是光强越高,混入的越多,但是异色光占比反而是在光强比较低时,占比比较高,光强高了以后占比就急速衰减了。

还有一个特殊情况,如果是RGBW或者RGBWY等,这种情况下,别人实现一般都是把W和Y单独使用,而不是把WY拆成RGB以后再和主RGB进行混光,主要还是以各自需求为准。

Summary

整个校准流程的顺序应该是:

  1. 感官层:输入理想的颜色值(HSL或RGB),应用Gamma校正
  2. 转换:将校正后的HSL转换为RGB(如果需要)
  3. LUT映射:通过3D LUT将理想的RGB值映射到实际硬件能输出的RGB值(这一步已经包含了混光的影响)
  4. 温漂修正:根据当前温度对每个通道进行光强修正

关键是要保证每个阶段只做自己该做的事,不要混在一起处理,否则会导致最终输出跑偏。