OpenISP 模块拆解 · 第15讲:色相饱和度控制 (HSC)
OpenISP 模块拆解 · 第15讲:色相饱和度控制 (HSC)
模块作用
HSC 是色相和饱和度控制模块,作用在 YUV 的 UV 色度通道。它用于整体颜色风格调整,例如让颜色更鲜艳、偏暖或偏冷。
openISP 实现
源码类名为HSC(img, hue, saturation, clip)。输入是 UV 两通道图像。
它先构造0..359度的 sin/cos LUT,并乘以 256 用作固定点。
理论公式
将 UV 去中心:
u = U - 128 v = V - 128色相旋转:
U' = u*cos(hue) + v*sin(hue) + 128 V' = v*cos(hue) - u*sin(hue) + 128饱和度缩放:
U'' = saturation * (U' - 128) / 256 + 128 V'' = saturation * (V' - 128) / 256 + 128其中saturation=256表示 1 倍。
读源码注意点
openISP 源码先计算 hue 旋转,但随后又用原始self.img计算 saturation 并覆盖前面的结果。因此当前实现中 hue 旋转实际没有生效,主要生效的是 saturation。
参数说明
| 参数 | 含义 |
|---|---|
hue | 色相旋转角度 |
saturation | 饱和度增益,256 为 1 倍 |
clip | 输出上限 |
面试问答
Q1: YUV 中如何调整饱和度?
以 128 为 UV 中性点,把 U/V 到 128 的偏移乘以饱和度系数,再加回 128。偏移越大,颜色越鲜艳。
Q2: 色相调整本质是什么?
在 UV 平面围绕中性点旋转向量,相当于改变颜色方向,但尽量保持色度幅度。
Q3: 饱和度过高有什么副作用?
会放大色噪、伪彩和压缩色块,也可能造成颜色 clipping,让肤色和自然物体不真实。
Q4: 为什么 HSC 常放在后段?
它属于风格调校,通常在基础颜色还原、降噪、伪彩处理之后做,避免把前面的问题放大。
Q5: openISP 的 HSC 有什么实现问题?
hue 旋转结果被 saturation 计算覆盖,导致 hue 参数实际不生效。应先旋转,再基于旋转结果做饱和度缩放。
