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 hillshade
produce 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). NoDataValue
i 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
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_calc
può 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 hillshade
grigi 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
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 2
viene aggiunta l'opacità , tuttavia, questi pixel mantengono vari valori più bianchi -b 1
e 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
3. Ulteriore ottimizzazione -b 1 (crop + blacken)
Dato che abbiamo una banda di opacità progressiva -b 2
su cui fare affidamento, potremmo creare -b 1
pixel 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
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:
Zoom, si prega di notare le ombre (prima vs dopo):
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 hillshade
uscita è 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.