Avancées sur la réduction de bruit pour darktable 3.0

[size=medium]Bonjour à tous[/size]

[size=medium]Ce post vise tout d’abord à expliquer les nouveaux paramètres de la réduction de bruit de profil introduits par mes changements qui ont eu lieu depuis janvier.[/size]
[size=medium]J’expliquerai en deuxième partie de post mon cheminement au long de ces 9 mois pour ceux que ça intéresserait.[/size]
[size=medium]Je finirai par détailler qques idées pour la suite :wink: [/size]

[size=medium]Un peu de contexte pour comprendre la suite - la réduction de bruit de profil, comment ça marche ?[/size]

[size=medium]Le profil qu’est ce que c’est ? C’est simplement qques paramètres (2 par canaux et par valeur ISO en l’occurrence)[/size][size=medium] qui décrivent la manière dont la variance du bruit évolue en fonction de la luminosité.[/size]
[size=medium]La variance est une mesure de la dispersion des valeurs autour de la moyenne, donc dans notre cas elle donne une information sur à quel point les valeurs des pixels bruités peuvent être éloignés des valeurs qu’ils devraient avoir s’il n’y avait pas de bruit.[/size]
[size=medium]Le profil permet d’exprimer la variance en fonction de la moyenne.[/size]

[size=medium]A quoi ça sert d’avoir ce profil ? Eh bien, les algorithmes de débruitage n’aiment pas gérer des données où la variance du bruit change partout. Du coup, le profil permet de définir une transformation sur l’image, appelée transformation de stabilisation de variance, qui permet d’obtenir une image où la variance du bruit devient constante : le bruit dans les zones sombres et les zones claires a alors les même caractéristiques, et l’algorithme de débruitage peut faire son boulot bien plus facilement.[/size]

[size=medium]Voilà donc comment marche la réduction de bruit de profil.[/size]

[size=medium]Nouveautés dans la réduction de bruit de profil[/size]

[size=medium]Nous avons vu que darktable utilise deux paramètres pour chaque canal et valeur ISO pour effectuer sa transformation de stabilisation de variance.[/size]
[size=medium]Un changement important introduit a été de changer la transformation de stabilisation de variance pour en avoir une plus générique, qui admet un 3ème paramètre permettant de contrôler si on débruite plus les ombres ou les hautes lumières, et permettant donc de trouver un équilibre.[/size]
[size=medium]Il faudrait idéalement déterminer ce paramètre lors du profilage, mais pour l’instant celui ci est inféré automatiquement avec une heuristique à partir des 2 paramètres connus du profil. Il peut de plus être modifié manuellement dans l’interface.[/size]
[size=medium]A noter que ce paramètre correspond au paramètre de gamma présent dans la réduction de bruit de Rawtherapee.[/size]
[size=medium]Ce changement de transformation de stabilisation de variance a aussi été l’occasion d’introduire un paramètre de réduction du biais, qui permet de corriger l’image lorsque les ombres deviennent violettes (ce qui arrive régulièrement à haut ISOs).[/size]

[size=medium]J’ai également apporté plusieurs nouveau paramètres dans l’algorithme des moyennes non locales.[/size]
[size=medium]Je trouvais personnellement cet algorithme inutilisable dès les moyens ISOs, et encore plus dans les hauts ISOs.[/size]
[size=medium]Il lui manquait simplement un peu de flexibilité ![/size]
[size=medium]Le premier paramètre ajouté est celui de diffusion, qui permet de réduire efficacement (à la fois en terme visuel et en terme de temps d’exécution) le bruit gros grain.[/size]
[size=medium]Un petit exemple sur une photo de jpg54, avec ce qu’on obtenait avant (sur la gauche), et ce qu’on peut obtenir maintenant (sur la droite).[/size]
[size=medium]On voit que la réduction de bruit à gauche créé un bruit gros grain bien moche.[/size]

[size=medium]J’ai ensuite rajouté un paramètre nommé « poids du point central » qui contrôle principalement les détails : il permet de récupérer des détails (et du bruit de grain fin). Lorsqu’on le met à de fortes valeurs, le module réduit principalement le bruit de chrominance. Un exemple, volontairement un peu exagéré, avec en haut pas de récupération des détails, et en bas une récupération des détails forte (l’image a été agrandie pour bien voir l’effet dans le post) :[/size]

[size=medium]Bon, c’est bien beau tout ça, mais ça fait plein de paramètres :[/size]

[size=medium]Qu’à cela ne tienne, j’ai ajouté un mode « auto », qui vous règle la grande majorité des paramètres tout seul en se basant sur le profil[/size][size=medium]. Et comme les choses automatiques c’est pas parfait, ce mode a un curseur pour ajuster ce qu’il vous propose. Augmentez la valeur de ce curseur si le débruitage est moche, réduisez le si le contraste local est trop lissé.[/size]
[size=medium]Ce paramètre doit être utilisé notamment si vous avez sous exposé fortement votre image.[/size]

[size=medium]Si vous modifiez les valeurs dans ce mode et que vous revenez en mode pas « auto », les curseurs seront à jour, comme si vous les aviez modifiés directement.[/size]

[size=medium]De plus, les paramètres par défaut du module sont aussi ajustés automatiquement en fonction du profil, ce qui permet un débruitage en un clic en activant le module.[/size]

[size=medium]Voilà pour ce qui est de la description des changements, j’espère que ça vous plaira à l’usage ! :slight_smile: [/size]

[size=small][size=large]Cheminement pour les modifications de la transformation de stabilisation de variance[/size][/size]

[size=medium]Problème de départ : la réduction de bruit de profil c’est chouette, mais sur les hauts ISOs le module galère à corriger les pixels qui sont complètement noirs.[/size]
[size=medium]D’autre part, j’avais constaté (avec votre aide) que sur les courbes des profils de bruit, après stabilisation, la variance avait une « bosse » dans les zones sombres, ce qui pouvait expliquer cela :[/size]
[size=medium]
[/size]

[size=medium]J’ai donc regardé le code servant à créer les profils, pour essayer de savoir d’où venait cette bosse et si ça pouvait s’arranger.[/size]
[size=medium]Je me suis aperçu que ce code se basait sur des hypothèses erronées. La variance obtenue après stabilisation était alors, sur mes photos, proche de 12-15, au lieu d’être proche de 1.[/size]
[size=medium]Je me suis donc lancé dans la réecriture du code, pour que ça marche mieux.[/size]
[size=medium]Là, je me suis aperçu que la modélisation avec 2 paramètres pour les profils était mauvaise, à la fois pour les très bas ISOs et les très hauts ISOs.[/size]
[size=medium]J’ai tâtonné un moment avant de trouver une expression de la variance en fonction de l’espérance qui marche bien. Celle ci impliquait 3 paramètres, et formait une généralisation de l’expression utilisée auparavent.[/size]

[size=medium]J’obtenais alors une variance bien stabilisée à 1, mais je vous passe les détails mais c’était un peu la galère pour que le code de profilage soit suffisamment robuste, et donne les meilleurs paramètres.[/size]

[size=medium]Le temps avançait vite, et la date limite pour intégrer de nouvelles fonctionnalités se rapprochait.[/size]
[size=medium]Comme ce genre de modification forçait à recréer tous les profils, je n’avais pas le droit à l’erreur : il fallait que l’outil de profilage soit le plus robuste possible.[/size]
[size=medium]Et je constatais que sur mes images, j’obtenais un lissage légèrement excessif des zones les plus sombres, à cause d’un des 3 paramètres du profil qui prenait des valeurs trop grandes.[/size]

[size=medium]J’ai donc préféré rajouter le 3ème paramètre de profil dans l’interface graphique du module, et laisser l’utilisateur le choisir. Cela permettait de ne pas avoir à refaire tous les profils.[/size]
[size=medium]J’ai ensuite regardé si je pouvais trouver une formule empirique pour l’estimer à partir des autres paramètres des profils (faux) actuels, puis fait le même boulot pour les autres paramètres des moyennes non locales, ce qui a fini par la création des modes « auto ». Et voilà :smiley:
[/size]

[size=small][size=medium]Idées pour la suite[/size][/size]

[size=medium]Une première idée serait de finir le boulot sur l’outil de profilage. Le problème c’est que c’est vraiment du tâtonnement pour obtenir un outil qui marche bien, donc ça peut être long, et puis la motivation diminue du fait des bons résultats obtenus avec les anciens profils. Pas sûr que je fasse ça donc.[/size]

[size=medium]Quelque chose qui m’embête plus, c’est que les moyennes non locales prennent pas mal de temps à s’exécuter sur mon PC.[/size]
[size=medium]J’aimerais un algorithme de débruitage plus rapide.[/size]
[size=medium]J’ai donc cherché dans l’état de l’art ce qui se faisait de rapide, et je suis tombé sur le filtre bilateral récursif : une implémentation très rapide permettant de faire en gros l’équivalent d’un filtre bilatéral. Dans la publi en question, ils disent que pour le débruitage c’est pas très adapté, mais je pense que c’est parce qu’ils n’ont pas essayé correctement :smiley: [/size]
[size=medium]Avec deux trois modifs, j’ai bon espoir que ça donne un bon débruitage qui soit assez rapide. J’aimerais donc intégrer ça, dans un premier temps dans la réduction de bruit de profil.[/size]

[size=medium]Ensuite, comme il y a des images sur lesquelles les profils marchent mal, j’aimerais créer un module de débruitage aveugle, c’est à dire un module qui créé son propre profil en fonction de l’image qu’il a à débruiter. J’ai repéré une approche qui permettrait de faire l’estimation de la variance du bruit, qui marche bien sur les raws d’après la publication.[/size]
[size=medium]Du coup, l’idée serait de combiner ça avec le débruitage par filtre bilateral récursif et voir ce que ça donne.[/size]

[size=medium]Bref, en résumé :[/size]
[size=medium]- j’ai encore de quoi m’occuper[/size]
[size=medium]- il y a encore de la marge de progrès pour le débruitage dans darktable, même si je trouve que cette année a été l’occasion d’un joli bond en avant ![/size]

[size=medium]Voilà, n’hésitez pas si vous avez des questions ou si vous voulez plus de détails :)[/size]
[hr]
Une mini demo sur la biche de mimi85, en une seule instance, sans autre module de débruitage, en ajustant les paramètres en mode auto :

BRAVO !!!

Bravo pour le boulot, j’ai utilisé réduction bruit (profil) sur mon échantillon de photos et c’est impressionnant sur des photos jusqu’à 25600 ISO (le maxi de mes Lumix). Un grand merci @RawFiner.

Chapeau !!!

merci rawfiner …

Très intéressant et très instructif à lire.

Merci aussi pour tout ce travail accompli :slight_smile: :slight_smile:

Cette version 3 de DT se présente vraiment très bien.
Je l’utilise depuis quelques jours mais je n’ai pas encore eu à utiliser la gestion du bruit.

Bravo et merci rawfiner pour ces belles évolutions et ces explications. Cet article mériterait d’être sur le blog darktable.fr !

Tout à fait ! Si @rawfiner m’en donne l’autorisation, je m’en occupe !

Merci à tous pour vos messages !
Effectivement, une publication sur le blog c’est une bonne idée. J’accepte avec plaisir ta proposition @jpverrue, merci beaucoup d’avoir proposé de t’en occuper :slight_smile:

Un très grand merci pour ce boulot, clairement darktable à fait un bon en avant de le traitement du bruit numérique.

Voilà, c’est fait : le sujet est maintenant un article sur le forum !
https://darktable.fr/2019/10/avancees-sur-la-reduction-de-bruit-dans-darktable-3-0/

Merci ! :slight_smile:

Super, ça donne une meilleure visibilité.

Je dois dire que l’évolution est bluffante.

Je viens de faire des essais à 25600 iso et c’est utilisable.

Vraiment un très très grand merci c’était encore un point ou DT était en retard, là il y a plus grand chose à lui reprocher :wink:

Je pense que la photo qu’a utilisée @RawFiner pour l’article a était prise à 25600 ISO avec un Lumix Gx7.

Merci pour ton retour d’expérience, qui me fait très plaisir :smiley:

Effectivement la photo de cathédrale de @jpg54 était celle à 25600 ISO avec le Lumic Gx7

Le Gx7 n’est pas réputé pour les ISO supérieur à 3200. Voilà la photo de la cathédrale à 25600 sans traitement :

Le test n’a rien d’exhaustif.

C’est une photo à 1250 ISO (capteur APS-C 24Mpix) largement sous-exposée (pour préserver les vitraux) de l’intérieur d’une cathédrale. Une photo normale, pas un test extrême.

Développée avec DT 2.7 et DXO PL2 et l’algo « Prime » de réduction du bruit (réputé comme le meilleur actuellement).
DXO en traitement auto et DT en « balance des blancs adaptative » et « Moyennes non-locales Auto »

Évidemment, les développements diffèrent un peu. Ici un détail 100%.
A gauche DT et à droite DXO.

Même si DXO reste encore meilleur dans la restitution des détails et la matière dans les ombres, DT est vraiment très bon.
Je suppose qu’avec une combinaison savante de moyennes non locales et d’ondelette, on doit se rapprocher encore de DXO.

En tout cas, pour mon usage, c’est plus que suffisant, sachant que le bruit se voit moins sur un tirage et qu’on ne regarde pas une photo sur écran à 100%.
Je pense même que dans un cas comme celui-ci, j’appliquerai plutôt une force de 0,75 au lieu de 1 ici.

Bravo.

Merci pour ce retour et cette comparaison, c’est toujours intéressant de se comparer à ce qui se fait ailleurs !
Dxo s’en sort très bien sur cette photo !

Est ce que tu pourrais mettre une comparaison de ce que ça donne avec le curseur de details un peu plus fort (disons vers 0.2) et la force plus basse (vers 0.75-0.8) s’il te plait ? :slight_smile:
Et aussi indiquer des temps d’execution approximatifs de darktable et de dxo pour exporter l’image ?
Merci :slight_smile:

je sois dire que le résultat en mode automatique est très bon jusqu’à 5000 iso sur mon Z7.

Au dessus le profil auto trouvé n’est pas parfait, mais il suffit d’augmenter la diffusion du bruit grossier et réduire la préservation des ombres pour avoir un résultat très fin.

à 25.600 iso crop de l’image avec avant sans réduction du bruit de profil et à droite avec le module activé et petit réglage vite fait.
Le bruit est bien supprimé et les fins détails et reflets biens préservé.

Avant pour arriver à un résultat bien moins bon je devais utiliser plusieurs modules et plusieurs instances. Et surtout la réduction de bruit non locale qui est très lente.