La source liée mentionne "changer son mode de fusion en <Multiplier>" , donc l'opération à faire n'est pas une simple moyenne des ombrages d'entrée (pour cela, voir aussi Comment faire la moyenne de gdal_hillshades? ). C'est autre chose. Pourtant, créons les 3 ombrages de différentes directions du soleil:
gdaldem hillshade input.tif hillshades_A.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
gdaldem hillshade input.tif hillshades_B.tmp.tif -s 111120 -z 5 -az 355 -alt 60 -compute_edges
gdaldem hillshade input.tif hillshades_C.tmp.tif -s 111120 -z 5 -az 275 -alt 60 -compute_edges
Conserver la valeur la plus basse de A, B, C
Le premier algorithme que j'ai pensé est de filtrer et de conserver les pixels les plus sombres, alias les pixels avec des valeurs plus faibles parmi les entrées A, B, CA booléennes peuvent le faire:
gdal_calc.py -A hillshades_A.tmp.tif -B hillshades_B.tmp.tif -C hillshades_C.tmp.tif --outfile=./hillshades_xl.tmp.tif \
--calc="(A*(A<=B)*(A<=C)+ B*(B<A)*(B<=C)+ C*(C<A)*(C<B))"
La zone dominée par les ombres représente désormais plus que le côté opposé d'un lignt central, elle a été augmentée de 40⁰ de chaque côté. Pas comme le lien fourni, cet algorithme actuel semble avoir trop perdu la zone d'éclairement.
Angle de 315±30⁰
(variation d'angle plus petite) plutôt que le courant 315±40⁰
ferait mieux.
Le diagramme ci-dessous est la base de l'équation. Il montre les sources lumineuses A, B, C et les comparaisons booléennes pour les valeurs de pixels A, B, C dans chaque partie. Les lignes d'égalité nécessitent une attention particulière pour être incluses dans le booléen. Les lignes médianes ont une valeur 221
pour la source de lumière perpendiculaire. Pensez aux zones d'influence , la source de lumière la plus proche est la principale influence et la plus éloignée la plus faible.
Conserver les valeurs extrêmes pour A, B, C
Un autre algorithme booléen pourrait consister à conserver les valeurs les plus extrêmes, à la fois les pixels les plus sombres et les plus blancs. Le diagramme suivant aide à comprendre la formule booléenne. Pour chaque sixième du cercle, il identifie la valeur à conserver de A, B, C et un booléen pour sélectionner la zone triangulaire plus la ligne d'égalité dans le sens horaire, et seulement cela . Il donne (du haut et dans le sens horaire):
--calc="A*(A>B)*(A>=C) + C*(C>A)*(A>=221) + B*(C>A)*(C>=221) + A*(A<B)*(B<=221) + C*(B>A)*(A<=221) + B*(B>A)*(C<=221)"
Si les variations d'angles ne sont pas trop importantes, cela pourrait donner de bons résultats.
Autres booléens
Vous pouvez créer des booléens plus complexes pour couvrir l'ensemble des cercles en utilisant n'importe quelle combinaison des segments de bordure. Il reste important qu'une seule valeur parmi A, B, C soit conservée pour un segment.
Multiplier
J'ai fait plusieurs tentatives infructueuses de multiply
valeurs de pixels sans formule éprouvée ni succès final. @Radouxju a souligné que (a*b*c)^(1/3)
(moyenne GÉOMÉTRIQUE) au lieu de la moyenne ARITHMÉTIQUE (a*b*c)/(255*255)
peut fonctionner. La moyenne géométrique est inférieure ou égale à la moyenne arithmétique, ce qui accentue l'obscurité des zones ombragées. Je ne l'ai pas encore testé.