カラーグレーディング
スクリプト: scripts/grade.py IN OUT --look NAME [--strength 0.8] [--lut file.cube] [--compare grid.png]
ルックを適用するには --look を指定。利用可能なルックの一覧は --list で表示。ffmpegのフィルターチェーンとしてルックを適用。--compare は複数のルックのビフォーアフター静止画をレンダリングするので、あなた(とユーザー)は目で見て選択できます。
1. 操作の順序(常に守る)
- 入力トランスフォーム: 回転/HDR/Log → Rec.709(Resolveではカラースペーストランスフォーム、ffmpegではLUTまたはトーンマップ)。決してログ素材をそのまま目でグレーディングしないでください。
- 補正(ニュートラルで一貫性のある状態にする): ホワイトバランス → 露出 → コントラスト → 彩度。目標: 白は白く、黒は黒く、肌は自然に、すべてのショットがマッチングしていること。
- ルック / クリエイティブグレード: 色相シフト、スプリットトーニング、カーブ、強度を下げたLUT。
- 仕上げ: ビネット、グレイン、ハレーション、シャープネス(最後)。
グレーディングは連結する前にセグメントごとに行い、エンコードは1回だけにします。シーケンス内のすべてのクリップに同じルックを適用します。ただし、変更がストーリービート(例: 穏やかな暖色のA → 混沌とした寒色のB)である場合を除きます。
2. メンタルモデル: ASC CDL
チャンネルごと: out = (in × slope + offset) ^ power、その後彩度を適用。
- slope → ハイライト/ゲイン、offset → シャドウ/リフト、power → ミッドトーン/ガンマ。
- 暖色のハイライト: Rのスロープを上げ、Bのスロープを少し下げる。 寒色のシャドウ: BとGのオフセットを上げ、Rを下げる。
- ffmpegでの同等機能:
colorbalance(シャドウ/ミッド/ハイをRGBごと)、colorlevels、curves、eq(コントラスト/ブライトネス/彩度/ガンマ)、colortemperature、lut3d、colorchannelmixer。
3. ルック(出発点 — フレームで判断し、調整する)
| ルック | 雰囲気 | 主要な操作 |
|---|---|---|
neutral-punch | クリーン、SNS向け | 小さなSカーブ、+8%彩度、色相シフトなし |
teal-orange | 大作、旅 | 寒色のシャドウ、暖色のハイライト、肌を保護(オレンジは肌の色相) |
warm-golden | ノスタルジック、フード、ライフスタイル | WB +300-600 K、持ち上げた暖色のシャドウ、ソフトなコントラスト |
cool-moody | テクノロジー、夜、ドラマ | より寒色のWB、彩度を落としたミッド、深くてつぶれていない黒 |
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. ショットのマッチング
- 最初に露出を合わせ(波形/平均輝度)、次にWB(ニュートラルなオブジェクトまたは白)、最後に彩度を合わせます。
- 簡単な数値マッチング: ショット間のニュートラル領域のチャンネルごとの平均と標準偏差を比較し、約2~3%以内になるようにスロープ/オフセットを調整します。
- カメラが混在する場合(スマホ + アクションカム + DSLR): すべてをまず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 in → WB/露出 → コントラスト/彩度 → セカンダリ(肌) → ルック/LUT → CST out → グレイン/ビネット。カラースペーストランスフォームを使用し、入力 = カメラログ(例: Apple Log)、出力 = Rec.709 Gamma 2.4とします。スティルまたはカラーブループ(プリ/ポストクリップ)でグレードをコピーします。davinci-resolveを参照してください。
9. 確認
3つ以上のショット(最も明るい、最も暗い、顔)のビフォーアフター静止画を並べて表示します。確認項目: 肌のハイライトがクリップしていない、ディテールが重要な部分の黒がつぶれていない、テキストオーバーレイが読みやすい、カット間でルックが一貫している。