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.