Étalonnage couleur
Script : scripts/grade.py IN OUT --look NOM [--strength 0.8] [--lut fichier.cube] [--compare grille.png]
Affiche les looks avec --list. Applique un look sous forme de chaîne de filtres ffmpeg ; --compare génère des images avant/après de plusieurs looks pour que vous (et l'utilisateur) puissiez choisir visuellement.
1. Ordre des opérations (toujours)
- Transformée d'entrée : rotation/HDR/log → Rec.709 (Color Space Transform dans Resolve, LUT ou tonemap dans ffmpeg). Ne jamais étalonner des images log directement à l'œil.
- Correction (rendre neutre et cohérent) : balance des blancs → exposition → contraste → saturation. Objectif : blancs blancs, noirs noirs, peau naturelle, chaque plan correspondant.
- Look / grade créatif : décalages de teinte, split toning, courbes, LUT à force réduite.
- Finitions : vignette, grain, halation, accentuation en dernier.
Étalonnez par segment avant concaténation pour encoder une seule fois. Même look pour chaque clip d'une séquence, sauf si un changement est un point narratif (ex. : chaud calme A → froid chaotique B).
2. Modèle mental : ASC CDL
Par canal : out = (in × slope + offset) ^ power, puis saturation.
- slope → hautes lumières/gain, offset → ombres/lift, power → tons moyens/gamma.
- Hautes lumières chaudes : augmenter le slope R, baisser légèrement le slope B. Ombres teal : monter le offset de B et G, baisser R.
- Équivalents ffmpeg :
colorbalance(ombres/tons moyens/hautes lumières par RGB),colorlevels,curves,eq(contraste/luminosité/saturation/gamma),colortemperature,lut3d,colorchannelmixer.
3. Looks (points de départ — évaluer sur les images, puis ajuster)
| Look | Sensation | Mouvements clés |
|---|---|---|
neutral-punch | propre, prêt pour les réseaux sociaux | petite courbe en S, +8 % sat, pas de décalage de teinte |
teal-orange | blockbuster, voyage | ombres teal, hautes lumières chaudes, protéger la peau (l'orange est la teinte de la peau) |
warm-golden | nostalgique, food, lifestyle | WB +300-600 K, ombres chaudes relevées, contraste doux |
cool-moody | tech, nuit, drame | WB plus froid, tons moyens désaturés, noirs profonds mais pas écrasés |
film-kodak | style tirage 2383/Portra | hautes lumières atténuées, légères ombres vert-cyan, tons moyens chauds, grain 4-8 % |
bleach-bypass | granuleux, guerre, sport | contraste élevé, -40 % saturation, hautes lumières argentées |
pastel-matte | esthétique, minimal, mode | noirs relevés (mat), contraste plus bas, -15 % sat, hautes lumières rose/pêche |
day-for-night | nuit simulée à partir de scènes de jour | -1,5 à -2 stops, teinte bleue, sat 0,3-0,5, écraser le ciel, garder les lumières pratiques chaudes |
vintage-faded | vidéo amateur, années 90 | noirs délavés, hautes lumières jaune-vert, bruit de chrominance, douceur |
bw-contrast | intemporel, documentaire | mixage luminance (R dominant pour la peau), forte courbe en S, grain |
cyberpunk-neon | ville de nuit, gaming | split magenta-cyan, haute saturation dans les hautes lumières, bloom sur les lumières |
Référence jour pour nuit : le module « LMT Day for Night » de DaVinci Resolve fonctionne en ACES AP1 linéaire avec power 0.5 → slope (0,3; 0,5; 0,8) → power 2,2 → saturation 0,3. Pour l'utiliser sur des images Rec.709, convertir Rec.709 → AP1 linéaire, appliquer, reconvertir, et cuire en une LUT 33 points .cube. Relever légèrement les sources très sombres avant la LUT.
4. LUTs
- Appliquer avec
lut3d=fichier.cube:interp=tetrahedral. Utiliser à force réduite en mélangeant :split[a][b];[b]lut3d=x.cube[g];[a][g]blend=all_expr='A*(1-0.7)+B*0.7'. - Les LUTs techniques (log → 709) sont exactes, utilisées à 100 %. Les LUTs créatives sont un assaisonnement, généralement 40-80 %.
- Ne jamais lire un fichier
.cubedans le contexte (des dizaines de milliers de nombres). Regarder son effet sur une image. - Générer des LUTs personnalisées en Python : construire une grille 33³, appliquer sa fonction couleur avec numpy, écrire
LUT_3D_SIZE 33+ lignes (R le plus rapide).
5. Tons chair
- La peau se situe sur la ligne des tons chair (~123° sur un vectorscope, ligne I) quelle que soit l'ethnie ; seules la luminance et la saturation changent.
- Lorsqu'on pousse des looks teal/froids, isoler la peau (clé HSL teinte 0-50°, saturation moyenne) et la préserver, sinon le visage devient gris/vert.
- Vérifier chaque plan de visage dans l'étalonnage en taille réelle.
6. Appariement des plans
- Apparier d'abord l'exposition (forme d'onde/luminance moyenne), puis la balance des blancs (objet neutre ou blanc), puis la saturation.
- Appariement numérique rapide : comparer la moyenne et l'écart-type par canal d'une région neutre entre les plans ; ajuster slope/offset jusqu'à ~2-3 % d'écart.
- Caméras mixtes (téléphone + caméra d'action + reflex) : convertir toutes en Rec.709 d'abord, puis apparier à la caméra de référence.
7. Touches finales
- Grain :
noise=alls=6:allf=t(temporel). Ajouter après le redimensionnement à la taille finale. Bandeaux 4K : le grain survit mieux à la compression avec des valeurs légèrement plus fortes. - Vignette :
vignette=PI/5subtil. Éviter sur du contenu avec du texte près des bords. - Halation / bloom : flouter une copie contenant uniquement les hautes lumières (seuil, gblur 20-40), teinter en rouge-orange, superposer en mode écran à 15-30 %.
- Accentuation :
unsharp=5:5:0.6une fois, à la fin, à la taille finale. - HDR vers SDR : voir le mappage tonal
ffmpeg-pipeline.
8. Dans DaVinci Resolve
Arbre de nœud de base : CST in → WB/exposition → contraste/sat → secondaire (peau) → look/LUT → CST out → grain/vignette. Utiliser Color Space Transform avec entrée = log caméra (ex. Apple Log) et sortie = Rec.709 Gamma 2.4. Copier les grades avec des images fixes ou des groupes de couleur (pré/post-clip). Voir davinci-resolve.
9. Vérifier
Images avant/après de 3+ plans (le plus lumineux, le plus sombre, un visage) côte à côte. Vérifier : pas de hautes lumières écrêtées sur la peau, noirs pas écrasés là où les détails comptent, incrustations de texte toujours lisibles, look cohérent entre les coupes.