08-11-18, 03:28
(Modification du message : 08-11-18, 03:50 par aurelienpierre.)
Contexte
Vous avez bien compris que, depuis 2 mois, je mets le nez dans le code de darktable, un peu pour améliorer le rendu des images, mais beaucoup pour rendre la chaîne de travail (workflow) efficace. Le workflow, c'est le grand oublié de darktable, avec des modules qui sont appliqués dans un ordre bizarre, 3 à 8 modules qui font plus ou moins la même chose, et une gestion de la couleur coulée dans le marbre (on travaille dans Lab à partir de RGB linéaire, circulez y a rien à voir).
Ces décisions ne font pas de sens, ni pour l'utilisateur avancé à qui on impose un workflow limité (tu bosses dans Lab, tu vis avec ses limites, et tu te tais), ni pour l'utilisateur de base qui se retrouve en face d'une machine à gaz alors que, oui, on aurait pu faire tellement plus simple… En ouvrant le code, parfois on a l'impression que c'est Windows qui s'est invité dans Linux : valeurs RGB codées en dur, conversions imposées d'un espace de couleur à un autre, etc. Les développeurs ont fait trop de choix et d'hypothèses à la place de l'utilisateur.
Problème
La courbe de base de darktable est une saloperie, héritée de darktable 0.1 qui bossait avec la librairie dcraw. Elle créée une transformation non linéaire du signal RGB beaucoup trop tôt dans le pipe, avant l'application des profils de couleur d'entrée et du color checker / LUT. Mais c'est compliqué d'expliquer aux utilisateurs qui adorent la fusion d'exposition que ce module est le mal incarné. La non-linéarité du signal fait exploser un certain nombre d'opérations (algébriques) subséquentes, ce qui peut expliquer la frustration de beaucoup d'utilisateurs qui tournent en rond d'un module à l'autre sans obtenir de résultat, puisque beaucoup d'opérations sont des convolutions (flou, netteté, rotation) et qu'un signal non-linéaire viole le théorème de Parseval qui est la base de toute convolution.
J'ai tenté d'ajouter un profil logarithmique en début de pipe, afin de transformer les valeurs RGB linéaires en valeurs RGB perceptuellement uniformes (en log, les stops sont également répartis), ce qui transforme le pipe en logarithme et peut avoir certains avantages notamment en très haute plage dynamique. Mais le pipe de darktable n'est pas prêt pour ça, et il faut alors venir inverser le gamma de l'espace de couleur ou de l'écran (avec la balance couleur, par exemple), à la fin du pipe, pour avoir une image correcte.
DKT a justement fait remarquer que c'était très un workflow très peu intuitif, même si Jean-Paul et les autres ont réussi à se l'approprier pour sauver des images à large plage dynamique autrement bonne pour la poubelle.
Solution
J'introduis donc aujourd'hui un nouveau module qui réimplémente le mappage de tonalités par logarithme, mais à la toute fin du pipe, couplé à un générateur de courbes de tonalités dites "filmiques" (on va y revenir), destiné à remapper automatiquement la sortie du logarithme vers une valeur de gris spécifique, c'est à dire le gris moyen défini par votre profil écran ou couleur.
Avant
Après
Vous pouvez compiler et tester ce module ici : https://github.com/aurelienpierre/darkta...-equalizer
Il possède une version C et une version accélérée SSE2 (2.1× plus rapide que la version de base), et la version OpenCL arrive.
Mode d'emploi
Le module s'utilise dans l'ordre des curseurs.
Le premier bloc vient directement du module correction du profil d'entrée et s'utilise pareil, à la différence que le curseur « plage dynamique » laisse place au curseur « exposition du blanc » (plage dynamique = exposition du blanc - exposition du noir, donc c'est juste une autre façon de l'écrire).
Utilisez la pipette du gris pour sélectionner la luminosité moyenne du sujet dans l'image. Au studio et en éclairage contrôlé, laissez 18 %. Dans de nombreux cas, vous allez tomber sur des valeurs proches de 18 % même avec l'optimiseur automatique.
La pipette de gris et du noir s'utilisent sur toute l'image, et prélèvent max et min. Quand vous avez beaucoup de bruit, où si le dématriçage n'est pas bon, l'optimiseur va coller le noir dans la tapis (-16 EV), il faudra alors le corriger à la main. Les plages dynamiques de référence pour chaque capteur à chaque sensibilité ISO peuvent se trouver sur DXOMark (cherchez votre appareil et ouvrez les graphes de mesures).
De bons réglages de plage dynamique doivent coller le blanc tout à droite de l'histogramme et le noir tout à gauche. Pas question ici de faire des choix esthétiques, de préserver le bruit, d'ajuster le contraste, etc. Ça, c'est pour la suite. Ici, on ajuste les bornes. Maximisez la plage dynamique, même si c'est moche.
Le second bloc construit, en interne, une courbe des tonalités qui ressemble à ça :
On appelle ça « folmique » parce que ça ressemble à la réponse en luminance de la bonne vieille pellicule, et que la pellicule, c'est beau.
Pourquoi réimplémenter la courbe des tonalités ? Parce que les points de contrôle vont être automatiquement calculés à partir des propriétés du logarithme, pour ajuster le gris. Du coup, vous réglez votre intention, et le module calcule les paramètres pour vous. Simple, non ?
Le contraste est la pente de la partie linéaire centrale de la courbe. Ajustez selon votre goût, des valeurs correctes sont généralement entre 1.5 et 2.
La latitude est la largeur de la zone linéaire centrale. Un plus petite latitude préserve d'avantage les détails dans les tonalités extrêmes, alors que qu'une plus grande latitude donne plus de contraste aux extrémités. La latitude est limitée mathématiquement entre 25 % et 95 % de la plage dynamique, ne soyez pas étonné si, dans l'interface, des valeurs vous sont interdites et si la latitude est mise à jour avec ces contraintes quand vous modifiez l'exposition du noir ou du blanc.
La balance ombres/hautes lumières permet d'allouer plus d'espace, dans les extrémités non-linéaires, aux hautes ou aux basses lumières selon les détails que vous voulez préserver en priorité.
La saturation est une correction uniquement soustractive pour pallier les sur-saturations qui peuvent arriver quand on modifie le contraste en RGB.
Le dernier bloc, vous n'y touchez pas. À part peut-être la luminosité du blanc et du noir si vous aimez les effets « vintage » délavés, le gris et la puissance (gamma) sont des caractéristiques déterminées par votre profil écran ou profil de couleur de sortie.
Comment ça marche
Le module essaie de positionner 5 points de contrôle à des endroits stratégiques, calculés à partir de vos paramètres, puis essaie de faire passer une courbe par ces points en utilisant une spline de Hermite (strictement monotone). Suivant les paramètres entrés, il est possible que des points soient trop proches pour permettre une interpolation par spline (maths…), le points trop proches sont alors supprimés et l'affichage vous envoie un avertissement du genre « filmic curve using 4 nodes - highlights lost ». Pas de panique, ça veut juste dire que le logiciel a dû s'arranger mais que vous n'aurez pas exactement le résultat souhaité.
Idées d'usage
Fusionné en fusion paramétrique, avec un adoucissement sur les hautes lumières et un flou, ce module donne souvent de meilleurs résultat que le module « ombres et hautes lumières ». Vous pouvez aussi empiler des instances pour un effet mieux contrôlé.
Combiné avec le module balance des couleurs, vous avez un duo de choc qui peut remplacer 80 % des cochonneries qui polluent l'interface.
Exemples
Avant :
Après : 2 instances de balance des couleurs avec les préréglages orange-bleu fournis + module filmic
Avant
Après : filmic + balance des couleurs avec neutralisation des couleurs automatique
Modules/cochonneries que filmic remplace
* courbes de base
* mappage global des tonalités
* mappage local des tonalités
* ombres/hautes lumières
Modules que filmic complète
* courbes des tonalités
Chaîne de travail suggérée
1. balance des blancs
2. exposition
3. filmic
4. balance couleur
5. débruitage s'il y a lieu
6. zones de couleurs si besoin
7. courbes des tonalités pour fignoler si nécessaire
Note de fin
La feature freeze the darktable 2.6 est dans 7 jours, j'ai besoin de vos tests. Secouez-le, battez le, et dites moi ce qui casse.
Vous avez bien compris que, depuis 2 mois, je mets le nez dans le code de darktable, un peu pour améliorer le rendu des images, mais beaucoup pour rendre la chaîne de travail (workflow) efficace. Le workflow, c'est le grand oublié de darktable, avec des modules qui sont appliqués dans un ordre bizarre, 3 à 8 modules qui font plus ou moins la même chose, et une gestion de la couleur coulée dans le marbre (on travaille dans Lab à partir de RGB linéaire, circulez y a rien à voir).
Ces décisions ne font pas de sens, ni pour l'utilisateur avancé à qui on impose un workflow limité (tu bosses dans Lab, tu vis avec ses limites, et tu te tais), ni pour l'utilisateur de base qui se retrouve en face d'une machine à gaz alors que, oui, on aurait pu faire tellement plus simple… En ouvrant le code, parfois on a l'impression que c'est Windows qui s'est invité dans Linux : valeurs RGB codées en dur, conversions imposées d'un espace de couleur à un autre, etc. Les développeurs ont fait trop de choix et d'hypothèses à la place de l'utilisateur.
Problème
La courbe de base de darktable est une saloperie, héritée de darktable 0.1 qui bossait avec la librairie dcraw. Elle créée une transformation non linéaire du signal RGB beaucoup trop tôt dans le pipe, avant l'application des profils de couleur d'entrée et du color checker / LUT. Mais c'est compliqué d'expliquer aux utilisateurs qui adorent la fusion d'exposition que ce module est le mal incarné. La non-linéarité du signal fait exploser un certain nombre d'opérations (algébriques) subséquentes, ce qui peut expliquer la frustration de beaucoup d'utilisateurs qui tournent en rond d'un module à l'autre sans obtenir de résultat, puisque beaucoup d'opérations sont des convolutions (flou, netteté, rotation) et qu'un signal non-linéaire viole le théorème de Parseval qui est la base de toute convolution.
J'ai tenté d'ajouter un profil logarithmique en début de pipe, afin de transformer les valeurs RGB linéaires en valeurs RGB perceptuellement uniformes (en log, les stops sont également répartis), ce qui transforme le pipe en logarithme et peut avoir certains avantages notamment en très haute plage dynamique. Mais le pipe de darktable n'est pas prêt pour ça, et il faut alors venir inverser le gamma de l'espace de couleur ou de l'écran (avec la balance couleur, par exemple), à la fin du pipe, pour avoir une image correcte.
DKT a justement fait remarquer que c'était très un workflow très peu intuitif, même si Jean-Paul et les autres ont réussi à se l'approprier pour sauver des images à large plage dynamique autrement bonne pour la poubelle.
Solution
J'introduis donc aujourd'hui un nouveau module qui réimplémente le mappage de tonalités par logarithme, mais à la toute fin du pipe, couplé à un générateur de courbes de tonalités dites "filmiques" (on va y revenir), destiné à remapper automatiquement la sortie du logarithme vers une valeur de gris spécifique, c'est à dire le gris moyen défini par votre profil écran ou couleur.
Avant
Après
Vous pouvez compiler et tester ce module ici : https://github.com/aurelienpierre/darkta...-equalizer
Il possède une version C et une version accélérée SSE2 (2.1× plus rapide que la version de base), et la version OpenCL arrive.
Mode d'emploi
Le module s'utilise dans l'ordre des curseurs.
Le premier bloc vient directement du module correction du profil d'entrée et s'utilise pareil, à la différence que le curseur « plage dynamique » laisse place au curseur « exposition du blanc » (plage dynamique = exposition du blanc - exposition du noir, donc c'est juste une autre façon de l'écrire).
Utilisez la pipette du gris pour sélectionner la luminosité moyenne du sujet dans l'image. Au studio et en éclairage contrôlé, laissez 18 %. Dans de nombreux cas, vous allez tomber sur des valeurs proches de 18 % même avec l'optimiseur automatique.
La pipette de gris et du noir s'utilisent sur toute l'image, et prélèvent max et min. Quand vous avez beaucoup de bruit, où si le dématriçage n'est pas bon, l'optimiseur va coller le noir dans la tapis (-16 EV), il faudra alors le corriger à la main. Les plages dynamiques de référence pour chaque capteur à chaque sensibilité ISO peuvent se trouver sur DXOMark (cherchez votre appareil et ouvrez les graphes de mesures).
De bons réglages de plage dynamique doivent coller le blanc tout à droite de l'histogramme et le noir tout à gauche. Pas question ici de faire des choix esthétiques, de préserver le bruit, d'ajuster le contraste, etc. Ça, c'est pour la suite. Ici, on ajuste les bornes. Maximisez la plage dynamique, même si c'est moche.
Le second bloc construit, en interne, une courbe des tonalités qui ressemble à ça :
On appelle ça « folmique » parce que ça ressemble à la réponse en luminance de la bonne vieille pellicule, et que la pellicule, c'est beau.
Pourquoi réimplémenter la courbe des tonalités ? Parce que les points de contrôle vont être automatiquement calculés à partir des propriétés du logarithme, pour ajuster le gris. Du coup, vous réglez votre intention, et le module calcule les paramètres pour vous. Simple, non ?
Le contraste est la pente de la partie linéaire centrale de la courbe. Ajustez selon votre goût, des valeurs correctes sont généralement entre 1.5 et 2.
La latitude est la largeur de la zone linéaire centrale. Un plus petite latitude préserve d'avantage les détails dans les tonalités extrêmes, alors que qu'une plus grande latitude donne plus de contraste aux extrémités. La latitude est limitée mathématiquement entre 25 % et 95 % de la plage dynamique, ne soyez pas étonné si, dans l'interface, des valeurs vous sont interdites et si la latitude est mise à jour avec ces contraintes quand vous modifiez l'exposition du noir ou du blanc.
La balance ombres/hautes lumières permet d'allouer plus d'espace, dans les extrémités non-linéaires, aux hautes ou aux basses lumières selon les détails que vous voulez préserver en priorité.
La saturation est une correction uniquement soustractive pour pallier les sur-saturations qui peuvent arriver quand on modifie le contraste en RGB.
Le dernier bloc, vous n'y touchez pas. À part peut-être la luminosité du blanc et du noir si vous aimez les effets « vintage » délavés, le gris et la puissance (gamma) sont des caractéristiques déterminées par votre profil écran ou profil de couleur de sortie.
Comment ça marche
Le module essaie de positionner 5 points de contrôle à des endroits stratégiques, calculés à partir de vos paramètres, puis essaie de faire passer une courbe par ces points en utilisant une spline de Hermite (strictement monotone). Suivant les paramètres entrés, il est possible que des points soient trop proches pour permettre une interpolation par spline (maths…), le points trop proches sont alors supprimés et l'affichage vous envoie un avertissement du genre « filmic curve using 4 nodes - highlights lost ». Pas de panique, ça veut juste dire que le logiciel a dû s'arranger mais que vous n'aurez pas exactement le résultat souhaité.
Idées d'usage
Fusionné en fusion paramétrique, avec un adoucissement sur les hautes lumières et un flou, ce module donne souvent de meilleurs résultat que le module « ombres et hautes lumières ». Vous pouvez aussi empiler des instances pour un effet mieux contrôlé.
Combiné avec le module balance des couleurs, vous avez un duo de choc qui peut remplacer 80 % des cochonneries qui polluent l'interface.
Exemples
Avant :
Après : 2 instances de balance des couleurs avec les préréglages orange-bleu fournis + module filmic
Avant
Après : filmic + balance des couleurs avec neutralisation des couleurs automatique
Modules/cochonneries que filmic remplace
* courbes de base
* mappage global des tonalités
* mappage local des tonalités
* ombres/hautes lumières
Modules que filmic complète
* courbes des tonalités
Chaîne de travail suggérée
1. balance des blancs
2. exposition
3. filmic
4. balance couleur
5. débruitage s'il y a lieu
6. zones de couleurs si besoin
7. courbes des tonalités pour fignoler si nécessaire
Note de fin
La feature freeze the darktable 2.6 est dans 7 jours, j'ai besoin de vos tests. Secouez-le, battez le, et dites moi ce qui casse.
Aurélien, photographe portraitiste, spécialiste calcul.
Développeur de filmique, égaliseur de tons, balance couleur, etc.
darktable est mon métier, pensez à m'aider :
Développeur de filmique, égaliseur de tons, balance couleur, etc.
darktable est mon métier, pensez à m'aider :