Tworzysz przezroczysty odcień wzgórza?


34

Dostaję eleganckie przezroczyste odcienie wzgórza dzięki kombinacji gdali convert. W porównaniu do powszechnie stosowanych odcieni wzgórz opartych na szarości, takie przezroczyste odcienie wzgórz są bardzo fajne, ponieważ można je umieścić między tłem mapy a innymi górnymi warstwami (drogi, buiding), aby zapewnić wrażenie 3D niezależnie od typu i koloru tła.

Jak to działa

Sztuczka: Zaczynając od wytworzonego przez Greya cienia wzgórza gdal hillshade, sztuczka polega na pobraniu wartości kanału szarego, odwróceniu każdej wartości i przeniesieniu tego wyniku do nowego kanału krycia. Czarny piksel [0,0,0] staje się [0,0,0,255] (krycie = 255), szary piksel [120,120,120] staje się niższy staje się [120,120,120,135] (krycie = 135, alias 255-120), biały piksel [255,255,255] stają się przezroczyste [255,255,255,0] (krycie = 0, alias 255-255) i tak dalej. Odcienie wzgórz są nieprzezroczyste i czarne , równiny stopniowo stają się (białe) przezroczyste . Koncepcyjnie równanie pasma piksela jest takie:

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 !

Aby uzyskać wyluzowane wideo na temat tego podejścia, wyjaśnione przez projektanta Photoshopa, zobacz Dodawanie zacieniowanej ulgi w Photoshopie (16 minut).

Pytanie

Biorąc ETOPO lub SRTM pochodzi hillshade szary (opartego gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, plik można pobrać tutaj ) jako wejście ...

... Jak wykonać sztuczkę cytowaną przez gdal lub w inny nieniszczący dla GIS sposób na takich plikach .tif?

Pamiętaj, że chcę zachować właściwości GIS (geolokalizacja).

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj


1
W zależności od tego, w jaki sposób dane referencyjne są przechowywane w tiff, może to być tak proste, jak zmiana nazwy pliku świata powiązanego z tiff.
Steve

@ Steve: dotyczy plików .tif wygenerowanych z rastra takiego jak SRTM lub ETOPO pogdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
Hugolpz

Myślę, że gdal_tranlatez kombinacji -b zespołu , maskowanego zespołu , -expand szarego | rgb | RGBA razem witht formuła opacity=-(px_grey_value)+255może być droga, ale nigdy nie dotknął zespoły i I'am wciąż zupełnie nieświadomi.
Hugolpz


próbowałeś gdal_edit.py przepisać współrzędną, rozmiar komórki i układ odniesienia?
radouxju,

Odpowiedzi:


42

Łupina od orzecha

Każdy zestaw 3 zdjęć poniżej powinien zostać odczytany, np. „Szary (pasmo) + krycie (pasmo) = wynik przezroczysty” . Możesz przetestować te procesy w ciągu kilku minut za pomocą powiązanego pliku makefile obsługiwanego przez github . Proces nr 3 to ten, który zalecam, z progiem między 170 (utrzymuje silne cienie) a 220 (utrzymuje wszystkie cienie). Proces 3 zapewnia najsilniejsze cienie i pozwala uniknąć efektu szarości i wybielenia. W razie potrzeby dostosuj ogólną nieprzezroczystość warstwy. Równania w --calc="<equation>"można również poprawić w razie potrzeby, używając gdal_calc.

Aby uzyskać wyluzowane wideo na temat tego podejścia, wyjaśnione przez projektanta Photoshopa, zobacz Dodawanie zacieniowanej ulgi w Photoshopie (16 minut).

tło

gdaldem hillshadetworzy jednopasmowy plik w skali szarości z zakresem wartości pikseli = [1-255], czyli od najciemniejszych cieni do najbardziej oświeconych pikseli. W przypadku płaskich obszarów px = 221 (#DDDDDD). NoDataValuepiksele otrzymują domyślną wartość dodatnią 0, również najciemniejsza czerń na wejściu i wyjściu jest i powinna być 1. Bez zdefiniowanego pasma krycia krycie wynosi 100% .

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

hillshade.tmp.tif

Chcemy zdefiniować i kontrolować 2. pasmo krycia!

Cele

Chcemy jednego zespołu w skali szarości -b 1 , to cień. Poza gdalem jest to szary pas z ciągłym zakresem, np. Px = [1-255]. Możemy wykadrować niepowiązane obszary (# 2) lub przyciemnić go do px = 1 i polegać na pasie krycia (# 3).

Chcemy jednego pasma krycia -b 2 , ogólnie odwrócenia cienia wzgórza lub pokrewnej funkcji tego. Możemy wykadrować nieistotne obszary (# 2). Musi to być ciągły zakres nieprzezroczystości, np. Px = [1-255], w przeciwnym razie nie ma elegancji.

gdal_calcmoże być użyty zarówno do wykonywania obliczeń matematycznych na pikselach z plików wejściowych A, B, C ... i sprawdzania wartości logicznych, takich jak A<220, która zwraca 1 (prawda) lub 0 (fałsz). Pozwala to na rachunek warunkowy. Jeśli warunek jest fałszywy, powiązana część równania zostaje unieważniona.

1. Szary klosz wzgórza przezroczysty

Poniżej przedstawiono bardzo dobre wyniki dwóch pasm ze standardowymi gdal hillshadeszarościami i bielszymi obszarami, które stają się coraz bardziej przejrzyste:

# 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. Optymalizacja za pomocą pseudo-uprawy (-b 1 i -b 2)

2/3 pikseli na -b 1(skala szarości) staje się niewidoczna gołym okiem po -b 2dodaniu krycia , ale piksele te zachowują różne bielsze -b 1i niskie -b 2wartości krycia . Mogą być wykonane wszystkie białe przezroczyste [255,1]piksele, co pozwala na lepszy współczynnik kompresji:

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

3. Dalsza optymalizacja -b 1 (przycięcie + czernienie)

Ponieważ mamy do czynienia z progresywnym pasmem krycia -b 2, możemy stworzyć -b 1piksele białe px = 255 przez 255*(A>220)lub czarne px = 1 przez 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 (przycięty) # 3, final.tif

Ten wynik pokazuje silniejsze cienie .

Wynik

Utworzenie przezroczystego cienia wzgórza ma na celu natychmiastowe usunięcie wcześniejszych szarych obszarów równiny i związanego z tym niepożądanego, ale wszechobecnego efektu blaknięcia szarości. Pożądany produkt uboczny to większa kontrola nad końcowym produktem wizualnym. Opisany proces usuwa większość szarych i wszystkich białych pikseli. Kolorowy zwykły obraz tła zachowa wybrane kolory, gdy zostanie nałożony przez przezroczyste do czarnych odcienie wzgórza, tylko zaciemnione obszary zostaną zaciemnione. Porównanie procesu nr 2 (po lewej) i nr 3 (po prawej) poniżej.

Przegląd :

Porównanie procesu nr 2 (po lewej) i nr 3 (po prawej), widok ogólny.

Powiększ, zwróć uwagę na cienie (przed vs po):

Porównanie procesu nr 2 (po lewej) i nr 3 (po prawej), widok szczegółów.

Dalsze optymalizacje

Białe obszary : Można również chcieć zachować najbardziej oświecone obszary, aby zwiększyć wrażenie 3D. Byłoby to dosłownie symetryczne tego obecnego podejścia z niewielkimi zmianami progów, a następnie scaleniem obu wyjść przez gdal_calc. Równina byłaby w 100% przezroczysta, a najciemniejsze cienie i najjaśniejsze obszary światła byłyby nieprzezroczyste.

Wygładzanie: Cieniowanie wejściowe może być wstępnie wygładzone, aby uzyskać lepszy efekt końcowy, patrz Wygładzanie DEM za pomocą GRASS?

Composite Hillshade ( Jak stworzyć kompozytowy shadows? ).

Ciekawy jest również zderzający się cień ( opis )

Notatki

  • Płaska powierzchnia progu w gdal hillshadeprodukcji jest px = 221 (#DDDDDD = [221221221]), znakowanie powierzchni płaskich. Ponadto piksel cienia wzgórza = 221 dzieli obrazy między nachylonymi w cieniu zboczami (A <221) i jasnymi zboczami (A> 221) pikseli.
  • Próg przetwarzania w px = [170-220], a sprawdzonych, utrzymuje prawie 100% oczu-zauważalne cieni, które same w sobie prawie ważne dla 15-35% powierzchni przyłożenia.
  • Rozmiar pliku> Kompresja: final.tif z # 1, # 2, # 3 wynosi ~ 1,3 MB bez kompresji, a następnie ~ 0,3-0,16 MB po kompresji, 80% oszczędności!
  • Rozmiar pliku> kadrowanie: od .326 KB w # 1 kolor przycięcia i krycie (# 2) osiągają 310 kb, kolor czerni (# 3) do 160 kb. Efekt przycinania dla rozmiaru pliku wynosi między 5 ~ 50% redukcji z progiem przy px = 220 i moim wejściem.

2
Zachęcanie do przywitania +1.
Hugolpz

2
Samouczek zakończony. Mój angielski może być zepsuty, możesz go poprawić.
Hugolpz

3
Chociaż musiałeś sam odpowiedzieć, ten wątek jest doskonałym tutorialem poruszającym wiele pytań dotyczących cieniowania wzgórza. Dobra robota!
Kersten

Twój samouczek to po prostu praca. Świetna robota. Czy możesz rozważyć odpowiedź na moje pytanie => tutaj ? Czy można utworzyć .ovr dla tego rodzaju GeoTIFF w skali szarości z pasmem alfa?
sandthorn

1
Cześć @ Sandthorn, pomimo mojej miłości do tego, nie jestem już w tej dziedzinie. Koszt znalezienia odpowiedzi będzie prawdopodobnie wyższy dla mnie-2018 niż dla ciebie-2018. Mam nadzieję, że moje rzeczy wskazują właściwy kierunek dla twojego problemu!
Hugolpz

7

Innym sposobem na uzyskanie tego samego rezultatu nieszarego płótna bardziej odpowiedniego do łączenia z innymi warstwami jest opcja „połączona” w gdaldem.

Wykonuje nachylenie i cień i łączy oba w jednej operacji. Obszary o nachyleniu 0 są białe. Obszary o nachyleniu 90 stopni są czarne dla odcienia nachylenia, z pewnym oświetleniem dodanym przez warstwę cienia wzgórza.

gdaldem hillshade -combined -compute_edges infile outfile.tif

Następnie użyj trybu łączenia wielu warstw, aby „udrapować” to na innych warstwach.

Cieniowanie standardowe / połączone

Standardowe cieniowanie

Połączone cieniowanie pomnożone przez warstwę bazową OSM (krycie około 50%) Połączone cieniowanie pomnożone przez warstwę bazową OSM


2

gdal+ convertoparty na przepływie pracy

Istnieje rozwiązanie gdal+ convert, które daje dobre efekty wizualne. Problem z tym rozwiązaniem polega na tym, że convertniszczy informacje geograficzne, które następnie trzeba przywrócić. Zwiększa liczbę akcji do uruchomienia.

# 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

Aby uzyskać wyjaśnienie dotyczące polecenia 4, zobacz: https://stackoverflow.com/a/23018544/1974961

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.