Jak stworzyć kompozytowy cień?

10

Koncepcja kompozytowego cienia wzgórza polega na połączeniu wielu cieni z różną orientacją światła słonecznego, aby uniknąć martwego pola. Wymaga połączenia 3 obrazów w cieniu wzgórza odpowiednio z 315⁰ (światło słoneczne NW, warstwa domyślna), +355 35 warstwa, + 275⁰ światło słoneczne. Zwiększa to detale i elegancję, jak pokazano poniżej. Pełny opis spoza GIS znajduje się tutaj .

wprowadź opis zdjęcia tutaj

Korzystając z dowolnego pliku srtm, 3 początkowe odcienie wzgórza można wykonać za pomocą:

gdaldem hillshade input.tif hillshades_A.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
gdaldem hillshade input.tif hillshades_B.tmp.tif -s 111120 -z 5 -az 355 -alt 60 -compute_edges
gdaldem hillshade input.tif hillshades_C.tmp.tif -s 111120 -z 5 -az 275 -alt 60 -compute_edges
Hugolpz
źródło

Odpowiedzi:

9

Połączone źródło wspomina „zmień tryb syntezy na <Mnożenie>” , więc operacja, którą należy wykonać, nie jest zwykłą średnią wejściowych odcieni wzgórza (w tym celu zobacz także Jak uśrednić gdal_hillshades? ). To coś innego. Jednak stwórzmy 3 odcienie wzgórz o różnych kierunkach nasłonecznienia:

gdaldem hillshade input.tif hillshades_A.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
gdaldem hillshade input.tif hillshades_B.tmp.tif -s 111120 -z 5 -az 355 -alt 60 -compute_edges
gdaldem hillshade input.tif hillshades_C.tmp.tif -s 111120 -z 5 -az 275 -alt 60 -compute_edges

wprowadź opis zdjęcia tutaj

Zachowaj najniższą wartość A, B, C.

Pierwszy algorytm, o którym myślałem, to filtrowanie i zatrzymywanie najciemniejszych pikseli, czyli piksele o niższych wartościach spośród wartości wejściowych A, B, CA, boolean, mogą to zrobić:

gdal_calc.py -A hillshades_A.tmp.tif  -B hillshades_B.tmp.tif -C hillshades_C.tmp.tif --outfile=./hillshades_xl.tmp.tif \
   --calc="(A*(A<=B)*(A<=C)+ B*(B<A)*(B<=C)+ C*(C<A)*(C<B))"

Obszar zdominowany przez cienie tworzy teraz więcej niż przeciwną stronę jednego centralnego lignta, został zwiększony o 40⁰ z każdej strony. Wydaje się, że nie w podanym linku obecny algorytm zbyt mocno utracił obszar oświecenia.

Kąt 315±30⁰(mniejsza zmiana kąta) zamiast tego prądu315±40⁰ byłby ładniejszy.

Poniższy schemat stanowi podstawę równania. Pokazuje źródła światła A, B, C i porównania boolowskie dla wartości pikseli A, B, C w każdej części. Linie równości wymagają szczególnej uwagi, aby zostały uwzględnione w logice. Linie środkowe mają wartość 221dla prostopadłego źródła światła. Pomyśl o obszarach wpływów , najbliższe źródło światła jest głównym wpływem, a najbliższe najsłabszym.

wprowadź opis zdjęcia tutaj

Zachowaj wartości ekstremalne dla A, B, C

Innym algorytmem logicznym może być zachowanie najbardziej ekstremalnych wartości, zarówno najciemniejszych, jak i najbardziej białych pikseli. Poniższy diagram pomaga zrozumieć formułę boolowską. Dla każdej szóstej okręgu określa wartość, którą należy zachować z A, B, C i logiczną, aby wybrać obszar trójkątny plus linię równości zgodnie z ruchem wskazówek zegara i tylko to . Daje (od góry i zgodnie z ruchem wskazówek zegara):

--calc="A*(A>B)*(A>=C) + C*(C>A)*(A>=221) + B*(C>A)*(C>=221) + A*(A<B)*(B<=221) + C*(B>A)*(A<=221) + B*(B>A)*(C<=221)"

wprowadź opis zdjęcia tutaj

Jeśli zmiany kątów nie są zbyt ważne, może dać dobre wyniki.

Inne booleany

Możesz utworzyć bardziej złożoną wartość logiczną, aby objąć całe koła za pomocą dowolnej kombinacji segmentów obramowania. Ważne jest, aby tylko jedna wartość zachować z A, B, C dla jednego segmentu.

Zwielokrotniać

Zrobiłem kilka prób failled do multiplypikseli wartości bez sprawdzonej formuły ani ostatecznego sukcesu. @Radouxju wskazał, że (a*b*c)^(1/3)(średnia GEOMETRYCZNA) zamiast średniej ARITMETYCZNEJ (a*b*c)/(255*255)może działać. Średnia geometryczna jest mniejsza lub równa średniej arytmetycznej, która podkreśla ciemność zacienionych obszarów. Jeszcze tego nie testowałem.

Hugolpz
źródło
Starałem się podsumować moją koncepcyjną naukę na temat kompozytów i tego, jak ktoś może to dostosować. Prawdziwa formuła „mnożenia” pozostaje mi nieznana.
Hugolpz
Dlaczego nie pomnożyć wartości i przeskalować wyników?
whuber
Nie próbowałem! Który wzór by to zrobił (A*B*C)/(255*255)?
Hugolpz
1
To byłby dobry początek :-).
whuber
1
nie jest „pomnożenie” za pomocą średniej GEOMETRYCZNEJ zamiast średniej ARTYMETYCZNEJ. (a b c) ^ (1/3). Średnia geometryczna jest mniejsza lub równa średniej arytmetycznej, która podkreśla ciemność zacienionych obszarów.
radouxju
0

Wydaje się , że numpy Gdal_calc ma więcej operatorów :

+ addition 
- subtraction 
/ division 
* multiplication 
= equals to 
< less than 
> larger than 
! not equal to 
? if clause 
M maximum of two values 
m minimum of two values 
B bit level operator

Nie znalazłem jasnych i odpowiednich przykładów użycia egzotycznych operatorów. Jeśli masz coś, podziel się.

Hugolpz
źródło
0

Narzędziem, które może to zrobić (między innymi) jest wizualizacja oparta na współczynniku Sky-View Factor Based ( http://iaps.zrc-sazu.si/en/svf#v ). Oblicz kilka parametrów terenu. Cholernie dobrze.

Dimitris Poursanidis
źródło