色彩调色
脚本:scripts/grade.py IN OUT --look NAME [--strength 0.8] [--lut file.cube] [--compare grid.png]
使用 --list 列出风格。通过 ffmpeg filter 链应用风格;--compare 渲染多种风格的帧前/后对比图,方便你和用户目视选择。
1. 操作顺序(始终遵循)
- 输入变换:旋转/HDR/对数 → Rec.709(Resolve 中的 Color Space Transform,ffmpeg 中的 LUT 或 tonemap)。切勿直接凭视觉对未转换的 log 素材调色。
- 修正(使其中性且一致):白平衡 → 曝光 → 对比度 → 饱和度。目标:白色部分变白,黑色部分变黑,肤色自然,每个镜头匹配。
- 风格 / 创意调色:色调偏移、分区着色、曲线、降低强度的 LUT。
- 后期处理:暗角、颗粒、光晕、锐化放在最后。
在拼接前对 每个片段分别调色,这样只需一次编码。序列中所有剪辑使用相同风格,除非故事节奏需要变化(例如宁静温暖的场景 A → 混乱冰冷的场景 B)。
2. 思维模型:ASC CDL
每通道:out = (in × slope + offset) ^ power,然后应用饱和度。
- slope → 高光/增益,offset → 阴影/提升,power → 中间调/伽马。
- 温暖的高光:提升 R 斜率,略微降低 B 斜率。冷色阴影:提高 B 和 G 的 offset,降低 R 的 offset。
- ffmpeg 等效工具:
colorbalance(每 RGB 通道阴影/中间调/高光)、colorlevels、curves、eq(对比度/亮度/饱和度/伽马)、colortemperature、lut3d、colorchannelmixer。
3. 风格(起点——在帧上判断后再调整)
| 风格 | 感受 | 关键操作 |
|---|---|---|
neutral-punch | 干净、适合社交媒体 | 微小的 S 曲线,+8% 饱和度,无色调偏移 |
teal-orange | 大片、旅行 | 冷色阴影、暖色高光、保护肤色(橙色是肤色的色调) |
warm-golden | 怀旧、美食、生活方式 | 白平衡 +300-600 K,温暖的阴影被提亮,柔和对比度 |
cool-moody | 科技、夜晚、戏剧 | 较冷的白平衡,中间调饱和度降低,深黑但不完全压死 |
film-kodak | 2383/Portra 风格打印 | 高光滚落,略微青绿阴影,温暖中间调,颗粒 4-8% |
bleach-bypass | 粗粝、战争、运动 | 高对比度,-40% 饱和度,银色高光 |
pastel-matte | 美学、简约、时尚 | 提亮黑色(哑光效果),降低对比度,-15% 饱和度,粉/桃色高光 |
day-for-night | 从日景模拟夜景 | 减 1.5-2 档曝光,蓝色调,饱和度 0.3-0.5,压暗天空,保持实用灯光温暖 |
vintage-faded | 家庭录像、90 年代 | 褪色黑色,黄绿高光,色度噪点,柔化 |
bw-contrast | 永恒、纪录片 | 亮度混合(R 权重高以保护肤色),强 S 曲线,颗粒 |
cyberpunk-neon | 夜城、游戏 | 品红-青分区,高光高饱和,灯光处发光 |
日夜转换参考:DaVinci Resolve 的 "LMT Day for Night" 在 ACES AP1 线性空间中的工作方式为 power 0.5 → slope (0.3, 0.5, 0.8) → power 2.2 → saturation 0.3。要将其用于 Rec.709 素材,请从 Rec.709 转换到线性 AP1,应用转换,转换回来,并将其烘焙为 33 点 .cube。在 LUT 之前,将非常暗的源素材稍微提亮。
4. LUT
- 使用
lut3d=file.cube:interp=tetrahedral应用。降低强度时通过混合来使用:split[a][b];[b]lut3d=x.cube[g];[a][g]blend=all_expr='A*(1-0.7)+B*0.7'。 - 技术 LUT(log→709)是精确的,使用 100%。创意 LUT 是调味料,通常 40-80%。
- 切勿将
.cube文件读入上下文(成千上万个数字)。通过帧上观察其效果来判断。 - 在 Python 中生成自定义 LUT:构建一个 33³ 网格,用 numpy 应用你的颜色函数,写入
LUT_3D_SIZE 33加行(R 最快)。
5. 肤色
- 肤色位于 肤色线(向量示波器上约 123°,I 线)上,无论种族如何;只有亮度和饱和度会变化。
- 当应用青色/冷色调风格时,隔离肤色(HSL 键值为色调 0-50°,中等饱和度)并保持它,否则面部会变灰或绿。
- 在全尺寸下调色时检查每个面部镜头。
6. 镜头匹配
- 先匹配曝光(波形图/平均亮度),然后白平衡(中性物体或白色),最后饱和度。
- 快速数值匹配:比较镜头之间中性区域的每通道均值和标准差;调整 slope/offset 直至差距在约 2-3% 以内。
- 混合相机(手机 + 运动相机 + 单反):先将所有素材转换为 Rec.709,然后与主摄像机匹配。
7. 后期处理细节
- 颗粒:
noise=alls=6:allf=t(时间域)。在缩放到最终尺寸后添加。4K 片段:颗粒在稍强的值下能更好地抗压缩。 - 暗角:
vignette=PI/5轻微效果。避免用在边缘有文字的素材上。 - 光晕 / 发光:模糊仅保留高光的副本(阈值,gblur 20-40),染成红橙色,以 15-30% 的强度叠加。
- 锐化:
unsharp=5:5:0.6一次,在最后,最终尺寸下进行。 - HDR 转 SDR:参见
ffmpeg-pipeline的色调映射部分。
8. 在 DaVinci Resolve 中
节点树基线:CST 输入 → 白平衡/曝光 → 对比度/饱和度 → 二级调色(肤色) → 风格/LUT → CST 输出 → 颗粒/暗角。使用 Color Space Transform,输入设为摄像机 log(例如 Apple Log),输出设为 Rec.709 Gamma 2.4。通过帧或颜色组(剪辑前后)复制调色。参见 davinci-resolve。
9. 验证
并排比较 3 帧以上的帧前/后快照(最亮、最暗、一张人脸)。检查:高光在肤色上没有裁切,黑色在细节重要区域未被压死,文字叠加仍然可读,跨剪切点的风格一致。