Creare una sfumatura trasparente?


34

Ottengo eleganti paralumi trasparenti tramite una combinazione gdale convert. Rispetto alla sfumatura di grigio su base comunemente usata, tali sfumature trasparenti sono molto interessanti perché possono essere posizionate tra lo sfondo della mappa e altri strati superiori (strade, edifici) per fornire una sensazione 3D qualunque sia il tipo e il colore dello sfondo.

Come funziona

Il trucco: a partire da una sfumatura di scala di grigi prodotta da gdal hillshade, il trucco è prendere i valori del canale grigio, invertire ciascun valore e trasferire questo risultato in un nuovo canale di opacità. Il pixel nero [0,0,0] diventa [0,0,0,255] (opacità = 255), il pixel grigio [120,120,120] si abbassa diventando [120,120,120,135] (opacità = 135, aka 255-120), pixel bianco [255,255,255] diventa trasparente [255.255.255,0] (opacità = 0, ovvero 255-255) e così via. Le sfumature delle colline sono opache e nere , le pianure diventano progressivamente (bianche) trasparenti . Concettualmente, l'equazione della banda del pixel è qualcosa del genere:

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 !

Per un video rilassato su questo approccio, spiegato da un designer di Photoshop, consultate Aggiungere Shaded Relief in Photoshop (16 minuti).

Domanda

L'assunzione di un Etopo o SRTM derivato hillshade a base di grigio ( gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, il file disponibile per il download qui ) come input ...

... Come fare il trucco citato in alto via gdal o in un altro modo non distruttivo GIS su tali file .tif?

Nota che desidero mantenere le proprietà GIS (geolocalizzazione).

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


1
A seconda di come sono archiviati i dati di riferimento in tiff, può essere facile come rinominare il file mondiale associato a tiff.
Steve,

@Steve: è per i file .tif generati da raster come SRTM o ETOPO dopogdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
Hugolpz,

Penso che gdal_tranlatecon una combinazione di -b band , -mask band , -expand gray | rgb | rgba insieme alla formula opacity=-(px_grey_value)+255possa essere la strada da percorrere, ma non ho mai toccato le band e sono ancora abbastanza all'oscuro.
Hugolpz,


hai provato gdal_edit.py per riscrivere le coordinate, le dimensioni della cella e il sistema di riferimento?
Radouxju,

Risposte:


42

guscio di noce

Ogni set di 3 immagini in basso dovrebbe essere letto come "grigio (banda) + opacità (banda) = risultato trasparente" . Puoi testare questi processi in pochi minuti tramite il makefile ospitato da github . Il processo n. 3 è quello che raccomando, con una soglia tra 170 (mantiene le ombre forti) e 220 (mantiene tutte le ombre). Il processo 3 fornisce le ombre più forti ed evita l' effetto ingrigimento-sbiancamento. Adatta l'opacità complessiva del livello risultante secondo necessità. Le equazioni --calc="<equation>"possono essere migliorate anche secondo necessità, usando gdal_calc.

Per un video rilassato su questo approccio, spiegato da un designer di Photoshop, consultate Aggiungere Shaded Relief in Photoshop (16 minuti).

sfondo

gdaldem hillshadeproduce un file in scala di grigi a una banda con valori di pixel intervallo = [1-255], ovvero dalle ombre più scure al pixel più illuminato. Per aree piane, px = 221 (#DDDDDD). NoDataValuei pixel ottengono nodatavalue predefinito 0, inoltre, il nero più scuro in input e in output è e dovrebbe essere 1. Senza una banda di opacità definita, l' opacità è del 100% .

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

hillshade.tmp.tif

Vogliamo definire e controllare una seconda banda di opacità!

obiettivi

Vogliamo una fascia in scala di grigi -b 1 , è la collina. Fuori da gdal, è una banda grigia con intervallo continuo come px = [1-255]. Possiamo ritagliare aree non rilevanti (# 2) o annerirle in px = 1 e fare affidamento sulla banda di opacità (# 3).

Vogliamo una banda di opacità -b 2 , generalmente l'inversione della sfumatura o una funzione correlata di ciò. Siamo in grado di ritagliare aree non rilevanti (n. 2). Deve essere una gamma continua di opacità come px = [1-255], altrimenti non c'è eleganza.

gdal_calcpuò essere usato sia per fare matematica sui pixel dai file di input A, B, C ... sia per controllare valori booleani come A<220, che restituisce 1 (vero) o 0 (falso). Ciò consente il calcolo condizionale. Se la condizione è falsa, la parte correlata dell'equazione viene annullata.

1. Paralume grigio reso trasparente

Quanto segue fornisce ottimi risultati a due bande con i gdal hillshadegrigi standard e le aree più bianche rese sempre più trasparenti:

# 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. Ottimizzazione tramite pseudo-ritaglio (-b 1 e -b 2)

2/3 dei pixel su -b 1(scala di grigi) diventano invisibili ad occhio nudo quando -b 2viene aggiunta l'opacità , tuttavia, questi pixel mantengono vari valori più bianchi -b 1e bassi di opacità -b 2. Possono essere realizzati tutti i [255,1]pixel trasparenti bianchi , consentendo un miglior tasso di compressione:

# 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, color.tif (ritagliato) # 2, opacity.tif (ritagliato) # 2, final_crop.tif

3. Ulteriore ottimizzazione -b 1 (crop + blacken)

Dato che abbiamo una banda di opacità progressiva -b 2su cui fare affidamento, potremmo creare -b 1pixel bianchi px = 255 via 255*(A>220)o neri 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 (ritagliato) # 3, final.tif

Questo risultato mostra ombre più forti .

Risultato

Creare una sfumatura di collina trasparente ha come obiettivo immediato rimuovere le ex aree grigie della pianura e il relativo effetto indesiderato ma onnipresente di ingrigimento. Il sottoprodotto desiderato è un maggiore controllo sul prodotto visivo finale. Il processo descritto rimuove la maggior parte dei pixel grigi e tutti bianchi. La semplice immagine di sfondo colorato manterrà i colori scelti quando viene sovrapposta dai colori delle colline trasparenti al nero, solo le aree ombreggiate verranno oscurate. Confronto tra il processo n. 2 (a sinistra) e n. 3 (a destra) di seguito.

Panoramica:

Confronto tra processo n. 2 (a sinistra) e n. 3 (a destra), vista generale.

Zoom, si prega di notare le ombre (prima vs dopo):

Confronto tra processo n. 2 (a sinistra) e n. 3 (a destra), vista dettagli.

Ulteriori ottimizzazioni

Aree bianche : si potrebbe anche voler mantenere le aree più illuminate per aumentare le sensazioni 3D. Sarebbe letteralmente il simmetrico di questo approccio attuale con lievi variazioni della soglia, quindi una fusione di entrambi gli output tramite gdal_calc. La pianura sarebbe trasparente al 100%, le ombre più scure e le aree più chiare illuminano opache.

Levigatura: è possibile pre-levigare la sfumatura di input per ottenere un risultato finale migliore, vedere Smoothing DEM usando GRASS?

Paralume composito ( come creare un paralume composito? ).

Interessante anche la collina a rilievo ( descrizione )

Gli appunti

  • La soglia dell'area piatta in gdal hillshadeuscita è px = 221 (#DDDDDD = [221.221.221]), che indica le aree piatte. Inoltre, px = 221 di hillshade divide le immagini tra pendenze in ombra (A <221) e pendenze in luce (A> 221).
  • Una soglia di elaborazione a px = [170-220] come dimostrato buono, mantiene quasi il 100% delle ombre visibili agli occhi, che a loro volta rappresentano appena il 15-35% dell'area in rilievo.
  • Dimensione file> Compressione: final.tif su # 1, # 2, # 3 è ~ 1,3 MB senza compressione, quindi ~ 0,3-0,16 MB dopo la compressione, 80% di risparmio!
  • Dimensione file> ritaglio: da .326 KB in # 1, il colore di ritaglio e l'opacità (# 2) arrivano a 310kb, il colore nero (# 3) arriva a 160kb. L'effetto di ritaglio sulla dimensione del file è compreso tra una riduzione del 5 ~ 50% con soglia a px = 220 e il mio input.

2
Incoraggiante +1 benvenuto.
Hugolpz,

2
Tutorial finito. Il mio inglese potrebbe essere rotto, sentiti libero di migliorare.
Hugolpz,

3
Sebbene tu abbia dovuto rispondere a te stesso, questa discussione è un eccellente tutorial che tocca molte domande riguardanti il ​​hillhading. Molto bene!
Kersten,

Il tuo tutorial è solo lavoro. Ottimo lavoro. Potresti per favore considerare di rispondere alla mia domanda => qui ? È possibile creare .ovr per questo tipo di GeoTIFF, in scala di grigi con banda alfa?
sandthorn,

1
Ciao @sandthorn, nonostante il mio amore per questo, non sono più in questo campo. Il costo per trovare la risposta sarà probabilmente più alto per me-2018 che per te-2018. Spero che le mie cose puntino nella giusta direzione per il tuo problema!
Hugolpz,

7

Un altro modo per ottenere lo stesso risultato di una tela non grigia più adatta alla combinazione con altri livelli è l'opzione 'combinata' in gdaldem.

Esegue una pendenza e un'ombra di collina e combina i due in un'unica operazione. Le aree con pendenza 0 sono bianche. Le aree con pendenza di 90 gradi sono nere per l'ombra del pendio, con una certa illuminazione aggiunta dallo strato collinare.

gdaldem hillshade -combined -compute_edges infile outfile.tif

Quindi usa una modalità di composizione a più livelli per "drappeggiare" su altri livelli.

Hillshading standard / combinato

Hillshading standard

Ombreggiatura combinata moltiplicata per il livello di base OSM (opacità intorno al 50%) Ombreggiatura combinata moltiplicata per il livello base OSM


2

gdal+ convertflusso di lavoro basato

C'è una soluzione gdal+ convertche offre buoni risultati visivi. Il problema con questa soluzione è che convertdistrugge le informazioni geografiche che è necessario ripristinare. Aumenta il numero di azioni da eseguire.

# 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

Per la spiegazione del comando 4, consultare: https://stackoverflow.com/a/23018544/1974961

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.