Diffusion ou netteté
La diffusion est une famille de processus physiques par lesquels des particules se déplacent et se propagent progressivement avec le temps, depuis une source qui les génère. En traitement d’image, la diffusion se produit principalement à deux endroits :
-
la diffusion des photons à travers le verre des lentilles (flou) ou l’air humide (brume),
-
la diffusion des pigments dans les encres liquides ou dans les aquarelles.
Dans les deux cas, la diffusion rend l’image moins nette en laissant “fuir” des particules et en lissant les variations locales.
Le module Diffusion ou netteté utilise un modèle physique généralisé pour décrire plusieurs sortes de diffusion, et peut être utilisé par les créateurs d’images soit pour simuler soit pour inverser des processus de diffusion.
Comme il s’agit d’un module hautement technique, plusieurs préréglages sont fournis pour montrer son utilité pour divers usages.
La diffusion peut être éliminée pour :
-
reconstruire l’image originale venant de capteurs munis de filtre passe-bas ou réduire le flou créé par la plupart des algorithmes de dématriçage (utilisez l’un des préréglages Netteté du dématriçage et déplacez le module avant le module Profil de couleur d’entrée dans le pipeline graphique),
-
inverser le flou statique d’objectif et le bokeh (utiliser l’un des préréglages Correction de flou d’objectif),
-
supprimer le voile atmosphérique (utiliser le préréglage Suppression de la brume),
-
ajouter une netteté perceptuelle supplémentaire (piqué) pour une meilleur lisibilité (utilisez le préréglage Contraste local).
Notez que les flous de mouvement ne peuvent pas être éliminés en annulant le processus de diffusion, car ils ne sont pas créés par un phénomène de diffusion.
La diffusion peut être ajoutée pour :
-
créer un effet Orton (utilisez le préréglage Lumière d’arrière-plan),
-
remplir des portions manquantes ou endommagées de l’image (utilisez le préréglage Remplir les hautes lumières),
-
débruiter d’une manière qui respecte les bords (utilisez l’un des préréglages Débruitage)
-
appliquer un flou de surface (utilisez le préréglage Flou de surface).
Comme le procédé est physique, même ses effets indésirables peuvent être utilisés à des fins créatives. Par exemple, vous pouvez :
-
simuler le dessin au trait ou l’aquarelle (utilisez les préréglages Simuler le dessin au trait ou Simuler l’aquarelle),
-
créer des motifs aléatoires et des textures en augmentant le bruit (peu à peu, avec des itérations, le bruit se connectera avec ses voisins pour créer des taches aléatoires).
Remarque : Ce module est très gourmand en ressources, car il s’agit d’un solveur d’équations différentielles aux dérivées partielles, anisotropique et multi-échelles. Le temps d’exécution du module augmente avec le nombre d’itérations et OpenCL est fortement recommandé. Quelques préréglages “rapides” sont fournis pour l’utilisation sur des systèmes sans OpenCL (les préréglages avec la mention rapide).
🔗Concepts
🔗Temps
La diffusion est un processus dépendant du temps : plus il dure, plus loin les particules peuvent se propager. Dans ce module, le temps est simulé en utilisant le nombre d’itérations (le nombre de fois que l’algorithme s’exécute sur lui-même). D’avantage d’itérations peuvent rendre la reconstruction (correction de flou, débruitage, suppression de la brume) plus précise si elle est correctement définie mais peuvent aussi la faire dégénérer.
🔗Direction
La diffusion naturelle se produit habituellement depuis les points à haut potentiel (haute énergie ou haute concentration de particules) vers les points à bas potentiel (basse énergie ou basse concentration de particules). Dans une image, cela signifie que la diffusion se produit toujours des pixels les plus clairs vers les pixels les plus sombres.
Cette implémentation particulière peut simuler la diffusion naturelle, en utilisant ce qu’on appelle une diffusion isotrope (toutes les directions ont la même priorité, comme pour la diffusion de chaleur), mais il est aussi possible de forcer une direction de diffusion prioritaire, parallèle aux gradients (forçant à diffuser à travers les bords des objets et créant des bords fantômes), ou perpendiculaire aux gradients, dans une direction nommée isophote (forçant une diffusion contenues dans les bords, comme dans une goutte d’aquarelle). La pondération relative de chaque direction est définie par l’utilisateur et peut être trouvée dans la section Direction du module.
🔗Vitesse
En fonction de la fluidité de l’environnement, les particules peuvent se déplacer plus ou moins librement et donc plus ou moins vite. La vitesse de diffusion peut être définie dans la section Vitesse du module.
Lors d’une reconstruction (débruitage, correction de flou, suppression de la brume), il est conseillé d’utiliser des vitesses faibles pour une meilleure précision. Cela empêche les dépassements numériques (et donc la détérioration de la solution) et peut requérir d’avantage d’itérations. Pour de petits nombres d’itérations, des vitesses plus importantes peuvent être utilisées. Notez que des flous larges ont besoin de beaucoup d’itérations pour une reconstruction correcte, et la vitesse doit être ajustée en conséquence pour éviter de dégénérer la solution.
Toutes les vitesses sont additionnées (premier au quatrième ordre), et les sommes premier ordre + second ordre
et troisième ordre + quatrième ordre
ne devraient jamais dépasser ± 100%, sauf si vous voulez produire du glitch art.
🔗Échelle
La diffusion naturelle est censée se produire uniquement aux coordonnées voisines les plus proches. C’est à dire que, à chaque itération, chaque pixel ne devrait interagir qu’avec ses 9 voisins les plus proches.
Ici, nous accélérons un peu les choses pour gagner du temps et réutiliser le schéma d’ondelettes multi-échelles du module Égaliseur de contraste, afin que nous puissions diffuser à différentes échelles. L’échelle maximale de diffusion est définie par le paramètre Étendue de rayon.
Indépendamment de la diffusion, un paramètre Netteté permet d’augmenter ou de diminuer les détails à chaque échelle, un peu comme les contrôles spline de l’égaliseur de contraste. Avec le curseur Sensibilité aux bords, cela offre les mêmes fonctionnalités que le module Égaliseur de contraste (onglet Luma et Contour), mais dans un espace RVB relatif à la scène.
🔗Contrôles du module
🔗Propriétés
- Itérations
- Le nombre de fois que l’algorithme doit être exécuté par dessus lui-même. Des valeurs élevées ralentissent le module mais permettent des reconstructions plus précises, à condition que les vitesses de diffusion soient suffisamment faibles.
- Rayon central
- L’échelle principale de la diffusion. La valeur zéro agit plus fortement sur les détails fins (utilisée pour la correction de flou et le débruitage). Les valeurs non nulles définissent la taille des détails à diffuser fortement (utilisées pour augmenter le contraste local).
- Étendue de rayon
- Cela vous permet de sélectionner la bande de rayons de détails sur laquelle agir, autour du rayon central. L’étendue de diffusion définit une plage d’échelles de détail entre (centre - étendue) et (centre + étendue) à l’intérieur de laquelle la diffusion est confinée. Les valeurs élevées diffusent sur une large bande de rayons, au détriment du temps de calcul. Les valeurs faibles diffusent plus proche autour du rayon central. Si vous envisagez de corriger un flou, la portée du rayon doit être approximativement égale à la largeur du flou de votre objectif et le rayon central doit être égal à zéro. Si vous prévoyez d’augmenter le contraste local, mais que vous ne voulez pas affecter la netteté ou le bruit, la portée du rayon doit être de 3/4 de votre rayon central maximum.
Les rayons sont exprimés en pixels de l’image en pleine résolution, donc copier-coller les réglages entre images de résolution différente peut conduire à des résultats légèrement différents, à l’exception de la netteté au niveau des pixels.
Pour les ingénieurs électriciens, ce qui est défini ici est un filtre passe-bande dans l’espace des ondelettes, utilisant une fenêtre fréquentielle gaussienne centrée sur le rayon central avec une atténuation (écart type) de l’étendue du rayon. Les échelles d’ondelettes sont analogues aux fréquences harmoniques et chaque échelle d’ondelettes définit le rayon des détails sur lesquels agir.
🔗Vitesse (netteté ↔ diffusion)
Dans les commandes suivantes, les valeurs positives appliquent la diffusion, les valeurs négatives annulent la diffusion (donc plus net) et zéro ne fait rien.
- Vitesse 1er ordre (gradient)
- La vitesse de diffusion des couches d’ondelettes basse fréquence dans la direction définie par le paramètre Anisotropie 1er ordre.
- Vitesse 2ème ordre (laplacien)
- La vitesse de diffusion des couches d’ondelette basse fréquence dans la direction définie par le paramètre Anisotropie 2ème ordre.
- Vitesse 3ème ordre (gradient du laplacien)
- La vitesse de diffusion des couches d’ondelette haute fréquence dans la direction définie par le paramètre Anisotropie 3ème ordre.
- Vitesse 4ème ordre (laplacien du laplacien)
- La vitesse de diffusion des couches d’ondelettes haute fréquence dans la direction définie par le paramètre Anisotropie 4ème ordre.
🔗Direction
Dans les contrôles suivants, les valeurs positives font que la diffusion évite les bords (isophotes), les valeurs négatives font que la diffusion suit les gradients au plus près, et zéro affecte les deux de manière égale (isotrope).
- Anisotropie 1er ordre
- La direction de diffusion des couches d’ondelettes basse fréquence par rapport à l’orientation du gradient de basse fréquence (paramètre Vitesse 1er ordre).
- Anisotropie 2ème ordre
- La direction de diffusion des couches d’ondelettes basse fréquence par rapport à l’orientation du gradient de hautes fréquence (paramètre Vitesse 2ème ordre).
- Anisotropie 3ème ordre
- La direction de diffusion des couches d’ondelettes haute fréquence par rapport à l’orientation du gradient de basse fréquence (paramètre Vitesse 3ème ordre).
- Anisotropie 4ème ordre
- La direction de diffusion des couches d’ondelettes haute fréquence par rapport à l’orientation du gradient haute fréquence (paramètre Vitesse 4ème ordre).
🔗Gestion des bords
- Netteté
- Applique un gain sur les détails des ondelettes, indépendamment des propriétés fixées ci-dessus. Zéro ne fait rien, les valeurs positives accentuent la netteté, les valeurs négatives floutent. C’est principalement utile comme variable d’ajustement lors du blooming ou du floutage, pour conserver une certaine netteté tout en ajoutant une lueur autour des bords. Il n’est pas conseillé de l’utiliser pour la netteté seule, puisque rien n’empêche les halos ou les franges avec ce réglage.
- Sensibilité aux bords
- Applique une pénalité sur les vitesses de diffusion lorsque des bords sont détectés. Cette détection utilise la variance locale autour de chaque pixel. Zéro désactive la pénalité, des valeurs plus élevées rendent la pénalité plus forte et plus sensible aux bords. Augmentez si vous remarquez des artefacts de bord comme des franges et des halos.
- Seuil des bords
- Définit un seuil de variance, qui affecte principalement les zones à faible variance (zones sombres ou floues, ou surfaces planes). Des valeurs positives augmenteront la pénalité pour les zones à faible variance, ce qui est bon pour accentuer ou augmenter le contraste local sans écraser les noirs. Des valeurs négatives diminueront la pénalité pour les zones à faible variance, ce qui est bon pour débruiter ou flouter avec un effet maximal sur les régions noires et floues.
🔗Spatialité de la diffusion
- Seuil du masque de luminance
- Ce contrôle est utile si vous souhaitez remplir les très hautes lumières en propageant le contenu voisin (inpainting). Pour des valeurs supérieures à 0 %, la diffusion ne se produira que dans les régions avec une luminance supérieure à ce réglage. Notez que du bruit gaussien sera ajouté dans ces régions pour simuler les particules et initialiser l’inpainting.
🔗Flux de travail
La principale difficulté de ce module est que si le résultat peut varier considérablement en fonction de ses paramètres d’entrée, ces paramètres n’ont aucun lien intuitif avec la vie quotidienne. Les utilisateurs risquent d’être dépassés, à moins qu’ils ne soient déjà familiarisés avec les équations aux dérivées partielles de Fourier. Cette section propose quelques façons d’aborder ce module sans avoir à comprendre la théorie sous-jacente.
🔗Conseils généraux
Si vous prévoyez de corriger le flou de votre image avec ce module, commencez toujours par corriger adéquatement les aberrations chromatiques et le bruit dans l’image, car cette correction risque d’amplifier ces défauts. Il est important de ne pas avoir de pixels noirs tronqués/bouchés dans l’image. Ceux-ci peuvent être corrigés avec la Correction du niveau du noir du module Exposition.
Puisqu’il fonctionne sur les canaux RVB séparés, il est préférable d’appliquer ce module après le module Calibration des couleurs, de sorte que vous commenciez avec une image d’entrée entièrement neutre et corrigée pour la balance des blancs. Notez qu’augmenter le contraste local ou la netteté va aussi induire un léger renforcement du contraste de couleur et de la saturation, ce qui est habituellement une bonne chose. Comme il utilise une régularisation basée sur la variance pour détecter les bords, il est également préférable de placer ce module avant toute opération non-linéaire.
🔗Démarrer avec des préréglages
Les préréglages fournis ont été ajustés par le développeur et testés sur une gamme d’images pour des usages typiques. Le moyen le plus simple consiste simplement à partir des préréglages, puis à les modifier au besoin :
-
si l’effet semble trop fort, diminuez le nombre d’itérations,
-
si des artefacts apparaissent aux bords, augmentez la Sensibilité aux bords,
-
si la correction du flou commence à affecter des parties légitimement floues (le bokeh), réduisez le rayon,
-
si la correction du flou paraît correct dans les zones claires mais excessif dans les zones sombres, augmentez le Seuil des bords,
-
si la correction du flou bouche et tronque des pixels noirs, diminuez la Correction du niveau du noir dans le module Exposition,
-
ajustez finement la Netteté à votre goût.
🔗Partir de zéro
Les réglages par défaut du module sont entièrement neutres et ne feront rien à votre image. L’esprit du module est que chaque ordre affecte la texture de l’image d’une façon particulière.
Commencez par régler les paramètres du premier ordre (vitesse et anisotropie) pour avoir une base initiale. Ensuite, ajustez le rayon. Ceci va affecter les textures les plus grossières (les flouter ou les rendre plus nettes). Souvenez vous que le premier ordre agit sur les basses fréquences des échelles d’ondelettes et suit une direction parallèle ou perpendiculaire au gradient des basses fréquences.
Ensuite, commencez les ajustements sur les paramètres du deuxième ordre (vitesse et anisotropie). Le deuxième ordre agit également sur les basses fréquences des échelles d’ondelettes mais suit cette fois une direction parallèle ou perpendiculaire au gradient des hautes fréquences, qui peut être soit la direction de la netteté maximale soit celle du bruit. Ceci peut être utilisé pour réduire le bruit (en utilisant le deuxième ordre en mode diffusion, avec des valeurs positives) quand vous avez utilisé le premier ordre en mode netteté (avec des valeurs négatives).
Ces deux étapes peuvent être effectuées sur l’image dézoomée. Souvenez-vous que, même si l’on a pris grand soin de rendre le résultat visuel de l’algorithme assez invariant à l’échelle, l’aperçu ne sera exact qu’en cas de zoom 1:1. Dans tous les cas, tout ce qui se passe au niveau du pixel (rayon < 2px) ne sera pas visible pour les niveaux de zoom inférieurs à 50 %.
À ce stade, vous souhaiterez peut-être modifier le contrôle sensibilité aux bords pour vous occuper des artefacts aux bords. En théorie, diffuser dans la direction isophote garantit que la diffusion est contenue à l’intérieur des bords, mais cela ne suffit pas lorsque des coins et des formes convexes pointues sont présents dans l’image.
Quand le contrôle de la sensibilité aux bords a été ajusté pour produire des résultats satisfaisants, l’image va habituellement devenir bien plus douce. Dans la plupart des cas, à cette étape, il est nécessaire d’augmenter le nombre d’itérations pour compenser. Ceci se fait au prix d’une pénalité de performance, donc pilotez soigneusement le compromis performance/qualité en fonction de votre matériel informatique. Si vous ne pouvez pas augmenter le nombre d’itérations, vous devrez augmenter la vitesse de diffusion.
La dernière étape consiste à affiner les troisième et quatrième ordres, qui s’occupent des hautes fréquences de chaque échelle d’ondelettes. Avec ces paramètres vous devrez faire preuve de beaucoup plus de mesure que dans le cas des premier et deuxième ordres. En effet ils peuvent très vite faire exploser le bruit.
Le troisième ordre suit la direction du gradient ou de l’isophote de la couche basse fréquence, il peut donc être utilisé pour guider la diffusion haute fréquence dans une direction qui est plus susceptible d’être légitime en ce qui concerne les bords réels (et moins susceptible de capter du bruit).
Le quatrième ordre suit la direction du gradient ou de l’isophote de la couche haute fréquence et est plus susceptible de capter le bruit. La diffusion sur le quatrième ordre est le meilleur moyen de réduire le bruit sans trop affecter la netteté, soit en tant que débruitage autonome, soit en tant qu’étape de régularisation dans un processus de suppression du flou.
🔗Utiliser plusieurs instances pour la reconstruction d’image
Le post-filtrage du bruit peut bénéficier de l’ajout d’un processus de diffusion ; ceci peut être appliqué comme une étape supplémentaire après le module Réduction du bruit (profil).
À l’inverse, les problèmes optiques suivant peuvent bénéficier d’une reconstruction par inversion du processus de diffusion :
-
le flou introduit par le filtre passe-bas du capteur (LPF) et/ou l’anti-crénelage appliqué par le module Dématriçage,
-
le flou d’objectif statique,
-
le voile atmosphérique et la brume,
-
la diffusion de la source de lumière (utilisant un diffuseur trop large), conduisant à un éclairage trop uniforme et manquant de contraste local sur le sujet.
Bien que plus d’un de ces problèmes puissent affecter la même image au même moment, il est préférable d’essayer de les résoudre séparément en utilisant plusieurs instances du module. Ce faisant, assurez-vous que les problèmes sont corrigés de l’échelle la plus grossière à l’échelle la plus fine, et que le débruitage se produit toujours en premier. Autrement dit, vos instances devraient apparaître dans l’ordre du pipeline graphique suivant :
-
débruitage,
-
amélioration du contraste local,
-
suppression du voile atmosphérique,
-
correction du flou de l’objectif,
-
correction du capteur et du dématriçage.
Commencer par les reconstructions sur les échelles les plus grossières réduit la probabilité d’introduire et d’augmenter le bruit en effectuant les reconstructions sur les échelles les plus fines. Ceci est contre-intuitif car ces processus n’arrivent pas dans cet ordre pendant la formation de l’image. Pour la même raison, le débruitage devrait toujours être effectué avant toute tentative d’augmenter la netteté ou le piqué.
🔗Remarques et avertissements
Bien que ce module ait été conçu pour être indépendant de l’échelle, sa sortie ne peut être garantie qu’à un zoom de 100 % et sur les exportations en haute qualité ou à pleine résolution. Les résultats à des niveaux de zoom plus bas ou à des dimensions d’exportations plus basses peuvent ne pas correspondre à vos attentes.
En réglant un algorithme de défloutage, essayez de garder à l’esprit que beaucoup des plus belles images de l’histoire de la photographie ont été prises avec des objectifs qui étaient très loin d’offrir la netteté de ceux disponibles aujourd’hui. Bien que la mode actuelle soit de construire et de vendre des objectifs de plus en plus nets, et d’avoir des logiciels qui appliquent des niveaux insensés d’accentuation de la netteté par dessus, cette vague ne conduit pas à de meilleures images et rend le processus de retouche plus pénible. Un léger flou a aussi un intérêt poétique dont les images HD aseptisées et chirurgicales peuvent manquer.
Il doit être noté que le contraste global (utilisant une simple courbe de tonalité ou les niveaux de blanc et de noir) affecte aussi notre perception de netteté, ce qui est très différent d’une netteté optique (la résolution optique). Les yeux humains ne sont sensibles qu’au contraste local, qui peut venir d’une vraie netteté optique (i.e. d’une absence de diffusion – des bords fins) mais aussi de transitions tonales amplifiées. Si un mappage global de tonalité est en place pour augmenter le contraste, l’image va paraître plus nette. Si un mappage de tonalité est utilisé pour diminuer le contraste, l’image va paraître plus floue. Dans aucun de ces cas, les bords réels des objets ne sont affectés d’une quelconque façon, et les conséquences perceptuelles ne sont que pure illusion.
Une partie du processus de vieillissement est la perte de la vue. Le niveau d’accentuation de la netteté que des gens de plus de 50 ans vont trouver plaisant risque de ne pas être le même que pour des gens dans la vingtaine. Cela mérite de chercher à augmenter la netteté pour obtenir un résultat plausible (correspondant à votre perception habituelle) plutôt qu’un résultat plaisant (qui risque de ne paraître beau que pour les gens qui ont la même vue que vous).
Finalement, juger de la netteté des images, zoomé à 1:1 (100 %) ou plus est une tâche insensée. Dans les musées, les expositions, et même à l’écran, le grand public regarde les images comme un ensemble, pas avec une loupe. De plus, dans la plupart des usages courants, les photographies dépassent rarement une résolution de 3000×2000 pixels (environ un tirage aux dimension A4/lettre à 300 PPP), ce qui, pour des capteurs de 24 Mpx, signifie sous-échantillonner par un facteur de 4. Quand vous examinez un fichier de 24 Mpx à 1:1, vous êtes en fait en train de regarder une image qui n’existera jamais. Augmenter la netteté au niveau du pixel, dans ce contexte, est un gaspillage de temps et de cycles processeur.