Ł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

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

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

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

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 :

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

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.