Transparenten Schatten schaffen?

34

Ich bekomme elegante transparente Schirme über eine Kombination gdalund convert. Im Vergleich zu den üblicherweise verwendeten grauen Schirmen sind solche transparenten Schirme sehr cool, da sie zwischen dem Kartenhintergrund und anderen oberen Ebenen (Straßen, Gebäude) platziert werden können, um ein 3D-Gefühl zu erzeugen, unabhängig von Art und Farbe des Hintergrunds.

Wie es funktioniert

Der Trick: Ausgehend von einem von erzeugten Graustufenhügel gdal hillshadebesteht der Trick darin, die Werte des Graukanals zu nehmen, jeden Wert zu invertieren und dieses Ergebnis in einen neuen Opazitätskanal zu fließen. Schwarzes Pixel [0,0,0] wird [0,0,0,255] (Opazität = 255), graues Pixel [120,120,120] wird niedriger, wird [120,120,120,135] (Opazität = 135, auch bekannt als 255-120), weißes Pixel [255,255,255] transparent werden [255,255,255,0] (Deckkraft = 0, auch bekannt als 255-255) und so weiter. Die Schattierungen der Hügel sind undurchsichtig und schwarz , die Ebenen werden zunehmend (weiß) transparent . Konzeptionell ist die Bandgleichung des Pixels wie folgt:

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 !

Ein entspanntes Video zu diesem Ansatz, das von einem Photoshop-Designer erklärt wurde, finden Sie unter Hinzufügen von schattierten Reliefs in Photoshop (16 Minuten).

Frage

Unter einem ETOPO oder SRTM abgeleitet grau-basiertem Schummerungs ( gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, Datei finden Sie hier zum Download ) als Eingabe ...

... Wie mache ich den oben genannten Trick über GDAL oder einen anderen nicht-GIS-destruktiven Weg für solche .tif-Dateien?

Beachten Sie, dass ich GIS-Eigenschaften behalten möchte (Geolokalisierung).

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Hugolpz
quelle
1
Abhängig davon, wie die Referenzierungsdaten im Tiff gespeichert sind, kann es so einfach sein, wie die dem Tiff zugeordnete World-Datei umzubenennen.
Steve
@Steve: Es ist für .tif-Dateien, die aus einem Raster wie SRTM oder ETOPO erstellt wurden, nachgdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
Hugolpz
Ich denke, gdal_tranlatemit einer Kombination aus -b Band , -mask Band , -expand grey | rgb | rgba zusammen mit der Formel opacity=-(px_grey_value)+255ist das der richtige Weg, aber ich habe noch nie Bands angerührt und bin immer noch ziemlich ratlos.
Hugolpz
Haben Sie versucht, mit gdal_edit.py die Koordinaten, die Zellengröße und das Referenzsystem neu zu schreiben?
Radouxju

Antworten:

42

Nussschale

Jeder Satz von 3 Bildern sollte wie folgt gelesen werden: "Grau (Band) + Opazität (Band) = transparentes Ergebnis" . Sie können diese Prozesse innerhalb von Minuten über das zugehörige von Github gehostete Makefile testen . Prozess Nr. 3 ist derjenige, den ich empfehle, mit einer Schwelle zwischen 170 (behält starke Schatten bei) und 220 (behält alle Schatten bei). Prozess 3 liefert die stärksten Schatten und vermeidet den Grau-Weiß-Effekt. Passen Sie die Gesamtdeckkraft der resultierenden Ebene nach Bedarf an. Die Gleichungen in --calc="<equation>"können bei Bedarf auch mit verbessert werden gdal_calc.

Ein entspanntes Video zu diesem Ansatz, das von einem Photoshop-Designer erklärt wurde, finden Sie unter Hinzufügen von schattierten Reliefs in Photoshop (16 Minuten).

Hintergrund

gdaldem hillshadeErzeugt eine Ein-Band-Graustufendatei mit einem Pixelwertebereich von [1-255], auch bekannt als von den dunkelsten Schatten bis zu den hellsten Pixeln. Für flache Bereiche ist px = 221 (#DDDDDD). NoDataValuePixel bekommen standardmäßig einen Nodatavalue 0, außerdem ist und sollte das dunkelste Schwarz in der Eingabe und in der Ausgabe sein 1. Wenn kein Opazitätsband definiert ist, beträgt die Opazität 100% .

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

hillshade.tmp.tif

Wir wollen ein 2. Opazitätsband definieren und steuern!

Ziele

Wir wollen eine Graustufen-Band -b 1 , das ist der Schatten. Außerhalb von GDAL ist dies ein grauer Streifen mit kontinuierlichem Bereich wie px = [1-255]. Wir können nicht relevante Bereiche ausschneiden (# 2) oder auf px = 1 schwärzen und uns auf das Opazitätsband verlassen (# 3).

Wir wollen ein Opazitätsband -b 2 , im Allgemeinen die Umkehrung des Schattens oder eine verwandte Funktion davon. Wir können nicht relevante Bereiche ausschneiden (# 2). Es muss ein kontinuierlicher Bereich von Opazitäten wie px = [1-255] sein, ansonsten gibt es keine Eleganz.

gdal_calckann verwendet werden, um Pixel aus den Eingabedateien A, B, C ... zu berechnen und um boolesche Werte zu überprüfen, z. B. A<220, die 1 (true) oder 0 (false) zurückgeben. Dies ermöglicht eine bedingte Berechnung. Wenn die Bedingung falsch ist, wird der zugehörige Teil der Gleichung aufgehoben.

1. Grauer Hügelschirm transparent gemacht

Das Folgende liefert ein sehr gutes Zwei-Band-Ergebnis, wobei die Standard- gdal hillshadeGrau- und Weißbereiche immer transparenter werden:

# 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. Optimierung über Pseudo-Crop (-b 1 & -b 2)

2/3 der Pixel auf -b 1(Graustufen) werden für bloße Augen unsichtbar, wenn die Deckkraft -b 2hinzugefügt wird. Diese Pixel behalten jedoch verschiedene weißere -b 1und niedrigere Deckkraftwerte bei -b 2. Sie können aus allen weißen transparenten [255,1]Pixeln bestehen, was eine bessere Komprimierungsrate ermöglicht:

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

3. Weitere -b 1 -Optimierung (Zuschneiden + Schwärzen)

Da wir ein progressives Opazitätsband haben -b 2, auf das wir uns verlassen können, können wir -b 1Pixel entweder als weiße Pixel = 255 Via 255*(A>220)oder schwarze Pixel = 1 Via definieren 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 (beschnitten) # 3, final.tif

Dieses Ergebnis zeigt stärkere Schatten .

Ergebnis

Die Schaffung eines transparenten Hügelschattens hat zum unmittelbaren Ziel, die ehemaligen Grauzonen der Ebene und den damit verbundenen unerwünschten, aber allgegenwärtigen Grauverblassungseffekt zu beseitigen . Das gewünschte Nebenprodukt ist eine erhöhte Kontrolle über das visuelle Endprodukt. Der beschriebene Prozess entfernt die meisten grauen und alle weißen Pixel. Das farbige Hintergrundbild behält seine ausgewählten Farben bei, wenn es von transparenten bis schwarzen Hügeln überlagert wird. Nur die schattierten Bereiche werden abgedunkelt. Vergleich von Prozess Nr. 2 (links) und Nr. 3 (rechts) unten.

Überblick :

Vergleich von Prozess Nr. 2 (links) und Nr. 3 (rechts), Gesamtansicht.

Zoom, bitte beachte die Schatten (vorher gegen nachher):

Vergleich von Prozess 2 (links) und 3 (rechts), Detailansicht.

Weitere Optimierungen

Weiße Bereiche : Möglicherweise möchten Sie auch die hellsten Bereiche beibehalten, um das 3D-Feeling zu verbessern. Es wäre buchstäblich die Symmetrie dieses aktuellen Ansatzes mit geringfügigen Schwellenwertänderungen, dann eine Zusammenführung beider Ausgänge über gdal_calc. Die Ebene wäre zu 100% transparent, die dunkelsten Schatten und die hellsten aufhellenden Bereiche undurchsichtig.

Glätten: Der Eingabehügel kann vorab geglättet werden, um ein besseres Endergebnis zu erzielen. Siehe Glätten von DEM mit GRASS?

Composite Hillshade ( Wie erstelle ich einen Composite Hillshade? ).

Interessant ist auch der steile Schatten ( Beschreibung )

Anmerkungen

  • Der Schwellenwert für flache Bereiche in der gdal hillshadeAusgabe ist px = 221 (#DDDDD = [221,221,221]), wodurch flache Bereiche markiert werden. Außerdem unterteilt px = 221 von hillshade die Bilder in Pixel mit Schattenschrägen (A <221) und Lichtschrägen (A> 221).
  • Eine Verarbeitungsschwelle bei px = [170-220] hat sich als gut erwiesen. Sie bewahrt nahezu 100% der augenfälligen Schatten, die selbst kaum 15-35% der Relieffläche ausmachen.
  • Dateigröße> Komprimierung: final.tif von # 1, # 2, # 3 ist ~ 1,3 MB ohne Komprimierung, dann ~ 0,3-0,16 MB nach Komprimierung, 80% Ersparnis!
  • Dateigröße> Zuschneiden: Ab 0,326 KB in # 1 erreichen die Zuschneidefarbe und die Deckkraft (# 2) 310 KB, die Schwärzungsfarbe (# 3) 160 KB. Der Cropping-Effekt auf die Dateigröße liegt zwischen 5 und 50% bei einem Schwellenwert von px = 220 und meiner Eingabe.
Hugolpz
quelle
2
Ermutigende +1 willkommen.
Hugolpz,
2
Tutorial beendet. Mein Englisch kann gebrochen sein, fühlen Sie sich frei, sich zu verbessern.
Hugolpz
3
Obwohl Sie sich selbst eine Antwort geben mussten, ist dieser Thread ein hervorragendes Tutorial, das viele Fragen zum Thema Hillshading behandelt. Gut gemacht!
Kersten
Ihr Tutorial ist nur Arbeit. Gute Arbeit. Könnten Sie bitte meine Frage beantworten => hier ? Ist es möglich, .ovr für diese Art von GeoTIFF, Graustufen mit Alpha-Band, zu erstellen?
Sanddorn
1
Hallo @sandthorn, trotz meiner Liebe dazu bin ich nicht mehr auf diesem Gebiet. Die Kosten, um die Antwort zu finden, werden für mich 2018 wahrscheinlich höher sein als für Sie 2018. Hoffe, mein Zeug zeigt in die richtige Richtung für Ihr Problem!
Hugolpz
7

Eine andere Möglichkeit, dasselbe Ergebnis einer nicht grauen Leinwand zu erzielen, die sich besser für die Kombination mit anderen Ebenen eignet, ist die Option 'kombiniert' in gdaldem.

Es führt einen Hang- und Hügelschatten aus und kombiniert die beiden in einem Arbeitsgang. Bereiche mit einer Neigung von 0 sind weiß. Bereiche mit einem Neigungswinkel von 90 Grad sind für den Neigungsschatten schwarz, wobei durch die Schattierungsschicht eine gewisse Beleuchtung hinzugefügt wird.

gdaldem hillshade -combined -compute_edges infile outfile.tif

Verwenden Sie dann einen Zusammensetzungsmodus mit mehreren Ebenen, um diese über andere Ebenen zu "drapieren".

Standard / Kombiniertes Hillshading

Standard Hillshading

Kombinierte Schattierung multipliziert mit OSM-Basisschicht (Deckkraft ca. 50%) Kombinierte Schattierung multipliziert mit OSM-Basisschicht

rauben
quelle
2

gdal+ convertbasierter Workflow

Es gibt eine gdal+ convertLösung, die gute visuelle Ergebnisse liefert. Das Problem bei dieser Lösung ist, dass convertgeografische Informationen zerstört werden, die Sie dann wiederherstellen müssen. Es erhöht die Anzahl der auszuführenden Aktionen.

# 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

Erläuterungen zu Befehl 4 finden Sie unter: https://stackoverflow.com/a/23018544/1974961

Hugolpz
quelle