Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Diffusion ou Netteté - Proposition d'interface alternative
#1
Bonjour tout le monde, 
 
Je propose ici une piste de réflexion pour une interface alternative simplifiée au module Diffusion ou netteté.  
1) Ce n'est PAS une demande d'ajout. C'est juste un début de discussion. Si des développeurs sont intéressés pour implémenter un truc semblable, tant mieux pour les autres. Sinon tant pis, moi je m'en sors très bien avec l'interface actuelle. 
2) Ce n'est PAS un remplacement d'interface, mais un AJOUT d'une interface "simplifiée" qui vient se superposer au-dessus de l'interface actuelle (avancée). Exactement comme le module Réduction de bruit propose les interfaces Moyennes non locales et Ondelettes, auxquelles viennent se superposer les interfaces simplifiées Moyennes non locales auto et Ondelettes auto, dont les curseurs "Auto" vont juste modifier les paramètres des deux premières interfaces. 

3) Les utilisateurs auraient donc le choix via menu déroulant (semblable à la réduction de bruit) entre les interfaces "
Simple" et "Avancé". Avancé étant l'interface actuelle. Simple étant une interface plus "compréhensible" pour le non mathématicien, mais qui ne permet PAS toute la finesse des réglages du mode Avancé (c’est-à-dire que certaines combinaisons du mode Avancé ne seront pas possible en mode Simple). 
 


Utilisation

1) On choisit la taille des éléments (en pixels) sur lesquels on agit.

2) On choisit si on diffuse ou si on accentue.

3) On choisit la force de l'effet. Voilà, c'est le minimum syndical.

4) Éventuellement, on affine ses réglages en augmentant le temps de traitement, en altérant la direction (= anisotropie) ou en choisissant une "optimisation" (j'ai pas encore trouvé de meilleur terme, voir plus bas).

[Image: image_transcoder.php?o=sys_images_editor...1693240905]


Description
Voici les éléments de l'interface Simple : 
 
[Interface] : Simple ou Avancé 
Inferface : Menu déroulant (semblable au choix de la réduction du bruit) (PAS des onglets, car les paramètres ne sont pas équivalents).  
Choix 
  • Avancé = Interface actuelle de diffusion ou netteté. L'interface Avancé pilote directement le module tel qu'actuellement. 
  • Simple= Interface "simplifiée" dont les réglages modifient les paramètres du mode Avancé. Le mode Simple ne pilote PAS directement l'algorithme du module, il modifie juste les paramètres du mode avancé (tout comme les réductions de bruit "auto" pilotent les moyennes non locales et ondelettes). Ce n'est pas bijectif : le mode Simple ne permet pas de récréer toutes les possibilités que le mode Avancé permet. Le mode Simple est également une bonne base pour qu'un débutant puisse choisir ses réglages, puis bascule sur le mode Avancé pour voir comment ses réglages ont été modifiés. 
 
 
Taille des éléments à influer : de [radius_min] à [radius_max] pixels, radius_min et radius_max sont des entiers ≥ 0 avec radius_max ≥ radius_min 
Interface : Menu déroulants proposant par défaut les choix 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 et 2048. On peut effectuer un clic gauche ou droit pour entrer directement d'autres valeurs (comme dans le module Recadrer). C'est plus logique pour le débutant de comprendre "je vais influer les éléments de 128 à 896 pixels" plutôt que je vais influer les éléments de "512 ± 384 pixels" (et encore, ça c'est quand on a compris ce qu'étaient radius_center et radius. 
J'ai proposé menu déroulant, mais ça peut aussi être 2 barres avec curseurs, ou une barre avec 2 curseurs (ça dépend comment vous préférez gérer ça). 
Calculs internes : Modifie les paramètres radius_center et radius du mode avancé. 
  • Si radius_min = 0, alors : 

    • radius_center = 0 
    • radius = radius_max 

  • Si radius_min > 0, alors : 

    • radius_center = (radius_max + radius_min)/2 
    • radius = (radius_max – radius_min)/2 

 
 
[Mode] : Diffuser ou Accentuer 
Interface : Menu déroulant  
Commentaire : Permet de choisir entre diffuser ou accentuer (netteté). D'après le dico, accentuer est bien l'antonyme de diffuser (plus juste que le terme netteté, car on peut accentuer la netteté ou le contraste local, on ne peut pas "netteter le contraste local"). Ce sera là l'une des limites du mode Basique ne permettra en effet que l'un ou l'autre (qui sont les cas les plus généraux) (enfin presque, voir plus bas). Pour des réglages différents (par exemple V3 en netteté et V4 en diffusion, se mettre en mode Avancé).  
Choix 
  • Diffuser : [Mode] = 1 
  • Accentuer : [Mode] = -1 
 
 
[Force] : Nombre à virgule, de 0 à l'infini. 
Interface : barre avec curseur. La valeur peut éventuellement être présentée en % (à discuter). 
Commentaire : détermine la force de l'effet. Plus on augmente, plus on diffuse ou accentue. Ce seul curseur Force va influer à la fois les vitesses (V1 à V4) et le nb d'itérations. C'est plus simple à comprendre pour le débutant  (ne demandez pas à un débutant de choisir entre vitesse et itérations, il veut juste que son effet soit plus fort ou moins fort). 
 
 
Allonger le temps de traitement : Nombre à virgule [Time], de 1 à l'infini 
Interface : barre avec curseur. La valeur peut éventuellement être présentée en % (à discuter). 
Commentaire : permet de déterminer si l'on souhaite privilégier la vitesse d'exécution (vitesses maximales, nb d'itérations minimales) ou laisser plus de temps (réduire la vitesse et augmenter le nb d'itérations) pour que l'effet soit éventuellement plus propre avec moins de divergences. Pour [Time] = 1, le module attribue la vitesse maximale possible et le nb minimal d'itérations possibles . En mettant des valeurs supérieures à 1, les vitesses sont alors réduites et le nb d'itérations est augmenté proportionnellement à [Time].  
On part du principe que la vitesse et le nb d'itérations sont équivalents ( Vitesse * Itérations = Force), ce qui est vrai dans une certaine mesure pour des petites valeurs mais pas toujours. Ce curseur [Time] est justement là pour réduire la vitesse au profit du nb d'itérations. 
Par exemple, pour une [Force] de valeur 5 (ou 500%) : 
  • Time = 1 (ou 100%) : on aura 5 itérations avec une vitesse de 100% 
  • Time = 1.2 (ou 120%) : on aura 6 itérations avec une vitesse de 83,3% 
  • Time = 4 (ou 400%) : on aura 20 itérations avec une vitesse de 25% (on quadruple le temps de traitement mais on garde la même "force" globale). 
 
 
Priorité : Nombre à virgule positif ou négatif [Anisotropy_global] de –10 à 10 (ou -1000% à +1000%) 
Interface : barre avec curseur. J'hésite entre les dénominations : 
  •  Affecter les bords <=> Affecter les surfaces (à l'intérieur des bords) ? 
  • Affecter les bords <=> Affecter les dégradés ? 
  • Prioriser les bords <=> Prioriser les surfaces ? 
  • Prioriser les bords <=> Prioriser les dégradés ? 
Commentaire : Rien de spécial, il s'agit juste du même curseur Anisotropie que le mode Avancé, avec des dénominations plus claires. A ceci près qu'il n'y a qu'un seul curseur et qu'il affecte les 4 curseurs du mode avancé (dans la majorité des cas, ces 4 curseurs sont très souvent égaux. Si quelqu'un veut affiner les réglages, il basculera en mode Avancé. J'ai beau réfléchir dans tous les sens, décrire le curseur "anisotropie" au débutant reste tout de même difficile. Si quelqu'un a des meilleures idées... 
Autre remarque : certains pré-réglages (présets) de diffusion ou netteté utilisent des anisotropies différentes (défloutage par exemple qui utilse +100% pour V1 et V3 et 0% pour V2 et V4). Bah tant pis, on perdra un peu en exactitude en mode Simple en imposant la même anisotropie à toutes les vitesses mais on gagnera en simplicité. De toute façon, celui qui veut plus de finesse ira en mode Avancé. 
Calculs internes : Modifie les paramètres anisotropie du mode avancé : 
Anisotropy_first = anisotropy_second = anisotropy_third = anisotropy_fourth = [anisotropie_global] 
 
 
[Optimisation] : Menu déroulant à choix multiple 
Interface : menu déroulant à choix multiple 
Commentaire : C'est un paramètre qui permet de choisir entre différentes matrices de facteurs pour les vitesses V1 à V4 (pour ne pas forcément travailler sur les mêmes vitesses). Ca permet d'éviter de travailler tout le temps sur les mêmes vitesses et d'apporter un peu plus de finesse au mode Simple. J'hésite beaucoup pour le nom à donner à ce réglage et aux différents choix. Actuellement, ce qui m'a paru le plus simple à comprendre (pour le débutant) est de parler de différentes "optimisations", certaines pour le contraste local, d'autres pour la netteté ou le débruitage. Le débutant pourra choisir "l'optimisation" qui semble la plus adaptée à sa situation sans se poser plus de questions. S'il veut affiner ses réglagles => go mode Avancé. 
Choix : les matrices sont données dans l'ordre des facteurs V1 à V4. On respecte également le fait que V1+V2 et V3+V4 ne doivent pas dépasser 100%. De même, on permet ici la vitesse maximale possible (les vitesses sont ensuite réduites avec le curseur [Time] si besoin. Ce qui fait que qu'une même Force peut avoir plus ou moins d'effet selon l'optimisation choisie (d'un facteur 1 à 0.5) 
  • Général : Optimisation = [ 0.5  0.5  0.5  0.5 ]  
  • Pour contraste local : Optimisation = [ 1  0  0  1 ] 
  • Pour netteté : Optimisation = [ 0  1  1  1 ] 
  • Pour Débruitage : Optimisation = [ 1  0  1  0 ] 
  • Pour effets rapides (Netteté ou contraste local) : Optimisation =  [ 0  0  1  0] 
  • Pour suppression de la brume : Optimisation = [ 1  -0.5  1  -0.5 ] 
  • Pour défloutage : Optimisation = [ 0.5  -0.25  1  -0.5 ] 
  • Agir sur les détails fins : Optimisation = [ 0  0  0.5  0.5 ] 
  • Agir sur les détails grossiers : Optimisation = [ 0.5  0.5  0  0 ] 
Remarque : j'espère beaucoup de commentaires et de retours de vous sur cette partie-là. Elle doit encore être peaufinée, voire complètement retravaillée. 
 
 
[Sharpness] : à retirer de l'interface Simple (de toute façon, ce n'est pas utilisé dans les pré-réglages). Elle sera disponible uniquement en mode "Avancé" 
 
Edge sensitivity [regularization] : => à garder en renommant en Protéger les bords 
 
Edge treshold  [variance_treshold] => à garder en renommant en Ignorer les surfaces lisses  
 
Luminance masking treshold [treshold] => A retirer ou à garder ? Je pencherai pour le supprimer du mode Simple mais c'est à discuter (est-ce des gens s'en servent souvent ?) 
 
 
Calculs internes supplémentaires
Le nombre d'itérations [iterations] est déterminé à partir des variables [Force] et [Time] (Allonger le temps de traitement) 
  • [iterations] = arrondi( Time * Force ) 
(arrondi au plus proche tel que arrondi(1.49) = 1 et arrondi(1.5) = 2) 
Par exemple une force de 4 (400%) donne 4 itérations pour Time = 1 et 8 itérations pour Time = 2.
Les vitesses V1, V2, V3 et V4 sont ensuite calculées en fonction du nb [iterations], du signe de [Mode] (diffuser ou accentuer), de la [Force] voulue et du facteur d'[optimisation] (on comprendra que optimisation[V1] est le premier terme de la matrice opitmisation, etc.) 
  • V1 : first = mode * Force * optimisation[V1] / iterations 
  • V2 : second = mode * Force * optimisation[V2] / iterations 
  • V3 : third = mode * Force * optimisation[V3] / iterations 
  • V4 : fourth = mode * Force * optimisation[V4] / iterations 
 








Exemples :

Voici ce que donneraient quelques présets existants en mode Simple. Je ne précise pas les paramètres Regularization et variance_treshold qui seront identiques au mode Avancé. 
 
Le préset Contraste local donnerait ceci :  
 
Interface = Simple 
Taille des éléments à influer = de 128 à 896 pixels 
Mode = Accentuer 
Force = 5 (ou 500%) 
Allonger le temps de traitement = 2 (ou 200%) 
Priorité = -250% (prioriser les bords) 
Optimisation = pour contraste local (matrice [ 1  0  0  1 ] ) 
 
 
Le préset Netteté filtre AA donnerait ceci :  
 
Interface = Simple 
Taille des éléments à influer = de 0 à 8 pixels 
Mode = Accentuer 
Force = 0.5 (ou 50%) 
Allonger le temps de traitement = 1 (ou 100%) 
Priorité = 100% (prioriser les surfaces/dégradés) 
Optimisation = Général (matrice [ 0.5  0.5  0.5  0.5 ] ) 
 
Commentaire : On doit mettre une force de 0.5 (et pas 0.25) car l'optimisation Général divise par 2 les vitesses. 
 
 
Le préset Débruitage (Fort) donnerait ceci :  
 
Interface = Simple 
Taille des éléments à influer = de 2 à 14 pixels 
Mode = Diffuser 
Force = 1.6 (ou 160%) 
Allonger le temps de traitement = 20 (ou 2 000 %) 
Priorité = 200% (prioriser les surfaces/dégradés) 
Optimisation = Pour débruitage (matrice [ 1  0  1  0 ] ) 
 
Commentaire 
Iterations = arrondi(1.6 * 20) = 32  
V1 = 1 * 1.6 * 1 / 20 = 0.05 = 5% On retombe bien sur nos pattes. 
D'ailleurs, on voit qu'on pourrait réduire le temps de traitement à 1 (au lieu de 20) et avoir 2 itérations à V1 = 80% (donc on irait bien plus vite mais le résultat risque d'être beaucoup moins propre).
Répondre
#2
Quelques remarques supplémentaires :

Interface

Le curseur "Allonger le temps de traitement" pourrait éventuellement être décalé plus bas dans les paramètres. A discuter.
(Pour rappel, "Allonger le temps de traitement" va réduire les vitesses d'ordre 1, 2 3 et 4 et augmenter en conséquence le nb d'itérations, pour conserver une "Force" globale équivalente). Le but est d'augmenter le temps de calcul pour un effet plus propre.

[Image: Interface-Diffusion-2.png]


Calcul de radius et radius_center (correctif)

Je me suis rendu compte d'une erreur dans mes calculs de radius et radius_center : ceux-ci doivent être entiers !
Si par exemple l'utilisateur choisit d'influer les détails de 1px à 2px (radius_min = 1 px, radius_max = 2 px),
on se retrouve avec :
  • radius_center = (2 + 1)/2 = 1.5
  • radius = (2 - 1)/2 = 0.5
Ce qui ne marche pas !

La valeur critique qui doit être respectée, c'est le radius_min (car plus petit, et si l'utilisateur sélectionne 1px, il veut 1px, pas 0px ou 2px !).
On peut tolérer une marge d'erreur sur le radius_max (c'est bien moins grave, et l'erreur est proportionnellement inférieure à celle de radius_min

Il faut donc plutôt utiliser les formules suivantes :

Si radius_min = 0, alors :
  • radius_center = 0
  • radius = radius_max

Si radius_min > 0, alors :
  • radius_center = arrondi.sup( (radius_max + radius_min)/2 )
  • radius = arrondi.sup( (radius_max – radius_min)/2 )

où l'on comprendra que arrondi.sup est l'arrondi à la valeur supérieure.

Exemple : l'utilisateur choisit d'influer sur les détails de 3 à 8 pixels.
radius_center = arrondi.sup( (8+3)/2) = arrondi.sup( 5.5 ) = 6
radius = arrondi.sup( (8-3)/2 ) = arrondi.sup( 2.5 ) = 3
Le module diffusion et netteté influera donc en réalité sur les détails de 3 à 9 pixels.

En gros, on autorise (selon les valeurs choisies) une majoration de 1px sur le radius_max. ça ne devrait pas fondamentalement changer le résultat (de toute façon, il est impossible de sélectionner exactement de 3 à 8 pixels en mode avancé).
Répondre
#3
C'est un module pas facile mais très intéressant par les rendus qu'il permet d'obtenir. Et l'exercice de simplification n'est pas ... simple !
Pour ma compréhension, comment (par quelle formule) influe le paramètre "Force" sur les 5 paramètres (le nbr itérations et les 5 vitesses de diff.) ? Ce serait peut être bien de conserver la notion de "basses et hautes fréquences" en dédoublant ce paramètre et en remplaçant le terme fréquences par un terme plus concret (détails, finesse ?)
Perso, je remplacerais "A travers les bords" et "Dans les surfaces" par "selon les dégradés" et "dans les zones à luminosité uniforme".
Répondre
#4
(02-09-23, 09:39)cherob a écrit : C'est un module pas facile mais très intéressant par les rendus qu'il permet d'obtenir. Et l'exercice de simplification n'est pas ... simple !
Pour ma compréhension, comment (par quelle formule) influe le paramètre "Force" sur les 5 paramètres (le nbr itérations et les 5 vitesses de diff.) ? Ce serait peut être bien de conserver la notion de "basses et hautes fréquences" en dédoublant ce paramètre et en remplaçant le terme fréquences par un terme plus concret (détails, finesse ?)

Mon explication ci-dessus n'est peut être pas très claire : je recommence !
On est d'accord que l'intensité de l'effet diffusion et netteté dépend à la fois des vitesses V1 à V4 et du nb d'itérations.
Ces paramètres sont donc remplacés par un seul paramètres Force (qui détermine donc l'intensité globale de l'effet).

> Le paramètre Force détermine l'intensité globale de l'effet en déterminant à la fois le nb d'itérations Et les vitesses V1 à V4. Par défaut (avec Time = 1), le module va utiliser les vitesses maximales possibles avec le nb minimal d'itérations.
Par exemple, une Force = 3 (ou Force = 300%) va donner 3 itérations avec des vitesses à 100%.
Une Force = 3,5 = 350% va donner 4 itérations avec des vitesses à 87.5% (parce qu'on ne peut pas avoir 3,5 itérations à 100%).
En gros, Force = Nb d'itérations * Vitesse

> Ensuite, si le résultat n'est pas propre, tu peux modifier le paramètre Allonger le temps de traitement (Time) qui va conserver la même Force mais augmenter le nb d'itérations en réduisant la vitesse. En gros, Time prend le nb d'itérations minimales requises, le multiplie par Time, puis recalcule les vitesses pour conserver la même force globale.
Exemple pour Force = 3 = 300%
Time = 1 (valeur minimale) => on reste sur 3 itérations à 100%
Time = 2 => on va avoir 6 itérations à vitesse 50%
Time = 4 => on va avoir 12 itérations à vitesse 25%

> Enfin, une fois qu'on a déterminé la vitesse et le nb d'itérations avec Force et Time, le paramètre Optimisation détermine comment on va répartir la vitesse dans les 4 vitesses V1 à V4.
Si Optimisation est réglé sur général, il va dire répartir la vitesse de façon égale entre V1, V2, V3 et V4 (V1 = V2 = V3 = V4 = Vitesse/2)
Avec Optimisation sur d'autres options, on va par exemple uniquement utiliser V1 et V4 (et avoir V2 et V3 à 0) ; ou uniquement V3 (et V1 = V2 = V4 = 0).
Bref, tu vois le principe.

L'idée est de remplacer la finesse des réglages des différentes vitesses par quelques options limitées qui ne permettront que des répartitions prédéfinies par le code. Cela afin que ce soit plus clair et plus simple pour le débutant.
J'ai bien indiqué que le mode SIMPLE ne permettait PAS toutes les variantes de réglages du mode AVANCE.
Le but est plutôt d'offrir une interface plus accessible aux débutants de prendre en main le module, et de leur permettre de switcher entre les interfaces SIMPLE et AVANCEES pour voir ce que donnent les changements du mode SIMPLE dans le mode AVANCE.


(02-09-23, 09:39)cherob a écrit : Perso, je remplacerais "A travers les bords" et "Dans les surfaces" par "selon les dégradés" et "dans les zones à luminosité uniforme".

C'est effectivement ouvert à discussion. J'avoue moi-même ne pas être convaincu par "A travers les bords/Dans les surfaces".
Répondre
#5
C'est clair pour le couple de paramètres FORCE et TEMPS de TRAITEMENT. Pour l 'OPTIMISATION les nom des items proposés ne conviennent que pour le mode "accentuer".

Concernant la taille des particules, seul le rayon central permet de la définir. Le rayon maximum permet de choisir l'étendue de la diffusion :
"Les caractéristiques de la diffusion
rayon maximum
C’est la distance maximale de diffusion, exprimée en pixels de l'image en pleine résolution. Des valeurs élevées diffusent plus loin, au détriment du temps de calcul. Les valeurs faibles diffusent plus près. Si vous envisagez de débruiter, le rayon maximum doit être approximativement la largeur du flou de votre objectif.
rayon central
C’est l’'échelle principale de la diffusion. Zéro fait que la diffusion agit plus fortement sur les détails fins (utilisés pour le flou et le débruitage). Des valeurs non nulles définissent la taille des détails à diffuser fortement (utilisés pour augmenter le contraste local).
"
Parler de taille mini et maxi prête donc à confusion. Il vaudrait peut être mieux mettre 2 lignes: "taille moyenne des détails à diffuser" (comme la taille d'une goutte) et "étendue de la diffusion" (comme une tache plus ou moins large).

Concernant la direction de l'effet (anistropie) c'est là que je suggérais pour l'interface simple de dédoubler le curseur, un premier pour les détails moyens (correspondant au ordre 1 et 2) et un second pour les détails très fins (ordre 3 et 4).

C'est vrais que ça complique un peu l'interface simple mais ça peut éviter d'être trop dérouté au passage à l'interface avancée.
Répondre
#6
Beau boulot, mais le seul chemin si tu souhaites faire aboutir un projet petit ou grand, c'est de faire une proposition (issue) sur le Github de darktable : https://github.com/darktable-org/darktable
Mes photos : jpverrue.fr
Répondre
#7
(03-09-23, 08:21)cherob a écrit : Parler de taille mini et maxi prête donc à confusion. Il vaudrait peut être mieux mettre 2 lignes:  "taille moyenne des détails à diffuser" (comme la taille d'une goutte) et  "étendue de la diffusion" (comme une tache plus ou moins large).

D'après ce qu'Aurélien a expliqué (il me semble) : le module agit sur les éléments qui ont une taille comprise entre radius_center - radius et radius_center + radius.

Par exemple, le pré-réglage Contraste local a radius_center = 512 et radius = 384
Le module effectue des décompositions en ondelettes successives et ne va agir que sur les décompositions ondelettes de 128 px (512-384) à 896 px (512+384).
Les "tâches" plus petites que 128px ne seront pas affectées. Les "tâches" plus grosses que 896px non plus.
Si radius_center = 0 ou si radius_center - radius ≤ 0, alors on affecte tous les éléments de 0px à radius_center+radius px.

C'est pour cela que permettre d'entrer directement le radius_min et radius_max me semble plus "parlant" au débutant.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)