Créer un abat-jour transparent?

34

J'obtiens d'élégants ombrages transparents via une combinaison gdalet convert. Comparé à un ombrage à base de gris couramment utilisé, de tels ombrages transparents sont très cool car ils peuvent être placés entre l'arrière-plan de la carte et d'autres couches supérieures (routes, bâtiments) pour donner une impression 3D quels que soient le type et la couleur de l'arrière-plan.

Comment ça marche

L'astuce: à partir d'un ombrage de gris produit par l'ombrage gdal hillshade, l'astuce consiste à prendre les valeurs du canal gris, à inverser chaque valeur et à transférer ce résultat dans un nouveau canal d'opacité. Le pixel noir [0,0,0] devient [0,0,0,255] (opacité = 255), le pixel gris [120,120,120] devient inférieur devenant [120,120,120,135] (opacité = 135, aussi appelé 255-120), pixel blanc [255,255,255] devenir transparent [255,255,255,0] (opacité = 0, autrement dit 255-255) et ainsi de suite. Les teintes des collines sont opaques et noires , les plaines deviennent progressivement (blanches) transparentes . Conceptuellement, l'équation de la bande de pixel est quelque chose de tel:

alpha_value([0])    = 255-0 = 255;   // black pixels get full opacity
alpha_value([Grey]) = 255-Grey;
// grey pixels get 255-GreyValue opacity.
alpha_value([255])  = 255-255 = 0  // white pixels get null opacity !

Pour une vidéo décontractée sur cette approche, expliquée par un concepteur de Photoshop, voir Ajouter un relief ombré à Photoshop (16 minutes).

Question

En prenant un ombrage dérivé de gris ETOPO ou SRTM ( gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, fichier disponible au téléchargement ici ) comme entrée ...

... Comment faire le truc cité supérieur via gdal ou un autre moyen non destructeur de SIG sur de tels fichiers .tif?

Notez que je souhaite conserver les propriétés SIG (géolocalisation).

entrez la description de l'image ici entrez la description de l'image ici

Hugolpz
la source
1
Selon la manière dont les données de référence sont stockées dans le fichier tiff, il peut s’avérer aussi simple que de renommer le fichier world associé au fichier tiff.
Steve
@Steve: c'est pour les fichiers .tif générés à partir de matrices telles que SRTM ou ETOPO aprèsgdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
Hugolpz
Je pense gdal_tranlatequ'avec une combinaison de -b band , -mask band , -expand grey | rgb | rgba avec la formule opacity=-(px_grey_value)+255peut être la voie à suivre, mais je n'ai jamais touché à des groupes et je suis encore assez désemparé.
Hugolpz
ajout d'un
abat
avez-vous essayé gdal_edit.py de réécrire les coordonnées, la taille de la cellule et le système de référence?
radouxju

Réponses:

42

Coquille de noix

Chaque série de 3 images ci-dessous doit être lue telle que "gris (bande) + opacité (bande) = résultat transparent" . Vous pouvez tester ces processus en quelques minutes via le fichier makehile hébergé par github associé . Le processus n ° 3 est celui que je recommande, avec un seuil compris entre 170 (conserve les ombres fortes) et 220 (conserve toutes les ombres). Le processus 3 fournit les ombres les plus fortes et évite les effets gris-blanchissant. Adaptez l'opacité globale du calque résultant en fonction de vos besoins. Les équations dans --calc="<equation>"peuvent être améliorées si nécessaire, en utilisant gdal_calc.

Pour une vidéo décontractée sur cette approche, expliquée par un concepteur de Photoshop, voir Ajouter un relief ombré à Photoshop (16 minutes).

Contexte

gdaldem hillshadeproduit un fichier d’échelle de gris à une bande avec une plage de valeurs en pixels = [1-255], allant des ombres les plus sombres au pixel le plus éclairé. Pour les zones plates, px = 221 (#DDDDDD). NoDataValueles pixels reçoivent par défaut la valeur nodatavalue 0; le noir le plus foncé en entrée et en sortie est et devrait être 1. Si aucune bande d'opacité n'est définie, l' opacité est de 100% .

gdaldem hillshade input.tif hillshade.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges

hillshade.tmp.tif

Nous voulons définir et contrôler un 2ème groupe d'opacité!

Objectifs

Nous voulons un groupe de niveaux de gris -b 1 , c'est l' ombre de la colline. En dehors de gdal, c'est une bande grise avec une plage continue telle que px = [1-255]. Nous pouvons rogner les zones non pertinentes (# 2) ou les noircir en px = 1 et utiliser la bande d'opacité (# 3).

Nous voulons une bande d'opacité -b 2 , généralement l'invert de l'ombre de la colline ou une fonction associée à celle-ci. Nous pouvons supprimer les zones non pertinentes (n ° 2). Ce doit être une gamme d'opacités telles que px = [1-255], sinon il n'y a pas d'élégance.

gdal_calcpeut être utilisé pour faire des calculs sur les pixels des fichiers d'entrée A, B, C ... et vérifier les valeurs booléennes telles que A<220, qui renvoie 1 (vrai) ou 0 (faux). Cela permet le calcul conditionnel. Si la condition est fausse, la partie liée de l'équation est annulée.

1. ombrage gris transparent

Ce qui suit donne de très bons résultats avec deux bandes avec les gdal hillshadegris standard et des zones plus blanches rendues de plus en plus transparentes:

# hillshade px=A, opacity is its invert: px=255-A
gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./opacity.tif --calc="255-A"
# assigns to relevant bands -b 1 and -b 2
gdalbuildvrt -separate ./final.vrt ./hillshade.tmp.tif ./opacity.tif

hillshade.tmp.tif # 1, opacity.tif # 1, final.tif

2. Optimisation via pseudo-crop (-b 1 & -b 2)

Les 2/3 des pixels -b 1activés (niveaux de gris) deviennent invisibles à l'œil nu lorsque l'opacité -b 2est ajoutée. Cependant, ces pixels conservent diverses valeurs d' -b 1opacité plus blanche et plus faible -b 2. Ils peuvent être tous les [255,1]pixels transparents blancs , permettant un meilleur taux de compression:

# filter the color band, keep greyness of relevant shadows below limit
gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./color_crop.tmp.tif \
    --calc="255*(A>220) +      A*(A<=220)"
# filter the opacity band, keep opacity of relevant shadows below limit
gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./opacity_crop.tmp.tif \
    --calc="  1*(A>220) +(256-A)*(A<=220)"
# gdalbuildvrt -separate ./final.vrt ./color_crop.tmp.tif ./opacity_crop.tmp.tif
# gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./final.vrt ./final_crop.tif

# 2, couleur.tif (recadrée) # 2, opacity.tif (recadrée) # 2, final_crop.tif

3. Optimisation ultérieure de -b 1 (recadrage + noircissement)

Puisque nous avons une bande d'opacité progressive -b 2sur laquelle nous pouvons compter, nous pourrions créer des -b 1pixels blancs px = 255 via 255*(A>220)ou noirs px = 1 via 1*(A>220).

gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./color.tmp.tif \
   --calc="255*(A>220) + 1*(A<=220)"
# gdal_calc.py -A ./hillshade.tmp.tif  --outfile=./opacity_crop.tmp.tif \
#  --calc="  1*(A>220) +(256-A)*(A<=220)".
# gdalbuildvrt -separate ./final.vrt ./color.tmp.tif ./opacity_crop.tif
# gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./final.vrt ./final.tif

# 3, color.tif # 2, opacity.tif (recadrée) # 3, final.tif

Ce résultat montre des ombres plus fortes .

Résultat

Créer un abat-jour transparent ayant pour objectif immédiat de supprimer les anciennes zones grises de la plaine et l’effet de vieillissement dégradé indésirable mais omniprésent . Le sous-produit souhaité est un contrôle accru sur le produit visuel final. Le processus décrit supprime la plupart des pixels gris et blancs. L'image d'arrière-plan unie colorée conservera ses couleurs choisies lorsqu'elle sera superposée par les ombrages de collines transparents à noirs, seules les zones ombragées seront assombries. Comparaison du processus n ° 2 (à gauche) et n ° 3 (à droite) ci-dessous.

Vue d'ensemble:

Comparaison du processus n ° 2 (à gauche) et n ° 3 (à droite), vue générale.

Zoom, remarquez les ombres (avant vs après):

Comparaison des processus n ° 2 (à gauche) et n ° 3 (à droite), vue détaillée.

Optimisations supplémentaires

Zones blanches : On peut également souhaiter conserver les zones les plus éclairées pour augmenter les sensations 3D. Ce serait littéralement la symétrie de cette approche actuelle avec des changements mineurs de seuil, puis une fusion des deux sorties via gdal_calc. La plaine serait 100% transparente, les ombres les plus sombres et les zones éclairées les plus claires sont opaques.

Lissage: L'ombrage d'entrée peut être pré-lissé pour obtenir un meilleur résultat final, voir Lissage de DEM avec GRASS?

Ombrage composite ( Comment créer un ombrage composite? ).

L'ombrage accidenté est également intéressant ( description )

Remarques

  • Le seuil de surface plate en gdal hillshadesortie est px = 221 (#DDDDDD = [221,221,221]), marquant les zones plates. De plus, px = 221 de l’ombrage divise les images entre les pentes dans l’ombre (A <221) et les pentes dans l’éclairage (A> 221).
  • Un seuil de traitement à px = [170-220] aussi bon s’est révélé, il garde près de 100% des ombres visibles des yeux, qui représentent à peine 15 à 35% de la surface en relief.
  • Taille du fichier> Compression: final.tif sur # 1, # 2, # 3: environ 1,3 Mo sans compression, puis environ 0,3 à 0,16 Mo après compression, soit une économie de 80%!
  • Taille du fichier> Recadrage : à partir de .326Ko en n ° 1, rognage des couleurs et de l'opacité (# 2) jusqu'à 310kb, couleur noircie (# 3) jusqu'à 160kb. L'effet de rognage sur la taille du fichier est compris entre 5 et 50% de réduction avec le seuil à px = 220 et mon entrée.
Hugolpz
la source
2
En encourageant +1 bienvenue.
Hugolpz
2
Tutoriel terminé. Mon anglais peut être cassé, n'hésitez pas à améliorer.
Hugolpz
3
Bien que vous ayez dû vous répondre, ce fil est un excellent didacticiel qui aborde de nombreuses questions concernant l’ombrage en pente. Bien joué!
Kersten
Votre tutoriel est juste du travail. Bon travail. Pourriez-vous s'il vous plaît envisager de répondre à ma question => ici ? Est-il possible de créer .ovr pour ce type de GeoTIFF, niveaux de gris avec bande alpha?
Sandthorn
1
Bonjour @sandthorn, malgré mon amour pour elle, je ne suis plus dans ce domaine. Le coût pour trouver la réponse sera probablement plus élevé pour moi-2018 que pour vous-2018. J'espère que mes documents vont dans la bonne direction pour votre problème!
Hugolpz
7

L'option 'combinée' de gdaldem est un autre moyen d'obtenir le même résultat avec une toile non grise plus appropriée pour la combinaison avec d'autres couches.

Il effectue une pente et l'ombre de la colline et combine les deux en une seule opération. Les zones de 0 pente sont blanches. Les zones de pente à 90 degrés sont noires pour l'ombre de la pente, avec une illumination ajoutée par la couche d'ombrage.

gdaldem hillshade -combined -compute_edges infile outfile.tif

Ensuite, utilisez un mode de composition multicouche pour le "draper" par-dessus d'autres couches.

Ombrage Standard / Combiné

Ombrage standard

Ombrage combiné multiplié par la couche de base OSM (opacité environ 50%) Ombre combinée multipliée par la couche de base OSM

Rob
la source
2

gdal+ convertFlux de travail basé

Il existe une solution gdal+ convertqui donne de bons résultats visuels. Le problème avec cette solution est que convertdétruit les informations géographiques que vous devez ensuite restaurer. Cela augmente le nombre d'actions à exécuter.

# Basic crop
gdal_translate -projwin 67 35.92 99 5 ../data/noaa/ETOPO1_Ice_g_geotiff.tif crop_xl.tmp.tif
# Grey-based hillshade
gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
# create a transparent hillshade:
convert shadedrelief.tmp.tif -fuzz 7% -fill "#FFFFFF" -opaque "#DDDDDD"  whited.jpg # makes all grey values white to lighten the filesize
convert whited.jpg -alpha copy -channel alpha -negate +channel trans.png # <=== TRICK HERE.
# Restore georeferencing & reproject            
gdal_translate -a_ullr 67 35.92 99 5 trans.png trans.tmp.gis.tif
gdalwarp -s_srs EPSG:4326 -t_srs ESPG:3857 ./trans.tmp.gis.tif ./trans_reproj.tmp.gis.tif
# Compress from 11MB to 2MB:
gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./trans_reproj.tmp.gis.tif ./trans.gis.tif

Pour l'explication de la commande 4, voir: https://stackoverflow.com/a/23018544/1974961

Hugolpz
la source