Como criar colinas compostas?


10

O conceito de colina composta é combinar várias colinas com diferentes orientações da luz solar para evitar pontos cegos. É necessário mesclar imagens de 3 colinas com 315⁰ (luz solar NW, camada padrão), + 355⁰ camada, + 275⁰ luz solar, respectivamente. Isso aumenta os detalhes e a elegância, conforme mostrado abaixo. Uma descrição completa que não é de GIS está aqui .

insira a descrição da imagem aqui

Usando qualquer arquivo srtm, as três colinas iniciais podem ser feitas via:

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

Respostas:


9

A fonte vinculada menciona "altere seu modo de fusão para <Multiply>" , para que a operação a ser executada não seja uma média simples de colinas de entrada (para isso, consulte também Como calcular a média de gdal_hillshades? ). É outra coisa. No entanto, vamos criar as três colinas com diferentes direções da luz solar:

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

insira a descrição da imagem aqui

Mantenha o menor valor de A, B, C

O primeiro algoritmo que pensei é filtrar e manter os pixels mais escuros, também conhecidos como pixels com valores mais baixos, entre as entradas A, B e CA booleanas:

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))"

A área dominada pelas sombras agora compõe mais do que o lado oposto de uma linha central, aumentando em 40 by de cada lado. Não como o link fornecido, esse algoritmo atual parece ter perdido muito a área iluminada.

Ângulo de 315±30⁰(menor variação de ângulo) em vez da corrente 315±40⁰seria melhor.

O diagrama abaixo é a base da equação. Ele mostra as fontes de luz A, B, C e as comparações booleanas dos valores de pixels A, B, C em cada parte. As linhas de igualdade precisam de uma atenção especial para serem incluídas no booleano. As linhas medianas têm valor 221para a fonte de luz perpendicular. Pense nas áreas de influência , a fonte de luz mais próxima é a principal e a mais distante, a mais fraca.

insira a descrição da imagem aqui

Mantenha valores extremos para A, B, C

Um outro algoritmo booleano poderia ser manter os valores mais extremos, os pixels mais escuros e os mais brancos. O diagrama a seguir ajuda a entender a fórmula booleana. Para cada sexto do círculo, ele identifica o valor a ser mantido de A, B, C e um Booleano para selecionar a área triangular mais a linha de igualdade no sentido horário, e somente isso . Dá (de cima e no sentido horário):

--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)"

insira a descrição da imagem aqui

Se a variação dos ângulos não for muito importante, poderá dar bons resultados.

Outros booleanos

Você pode criar booleanos mais complexos para cobrir os círculos inteiros usando qualquer combinação dos segmentos de borda. Permanece importante que apenas um valor de A, B, C seja mantido para um segmento.

Multiplicar

Fiz várias tentativas frustradas de obter multiplyvalores de pixels sem uma fórmula comprovada nem sucesso final. @Rououxju apontou que (a*b*c)^(1/3)(média GEOMÉTRICA), em vez da média aritmética, (a*b*c)/(255*255)pode funcionar. A média geométrica é menor ou igual à média aritmética, que acentua a escuridão das áreas sombreadas. Ainda não testei.


Tentei resumir meu aprendizado conceitual sobre composto e como alguém poderia personalizá-lo. A verdadeira fórmula para "multiplicar" permanece desconhecida para mim.
Hugolpz

Por que não apenas multiplicar os valores e redimensionar os resultados?
whuber

Ainda não tentei! Qual fórmula faria isso (A*B*C)/(255*255)?
Hugolpz

1
Isso seria um bom começo :-).
whuber

1
não é "multiplicado" usando a média GEOMÉTRICA em vez da média ARITMÉTICA. (a b c) ^ (1/3). A média geométrica é menor ou igual à média aritmética, que acentua a escuridão das áreas sombreadas.
Radouxju

0

Uma ferramenta que pode fazer isso (entre outras) é a Visualização Baseada em Fator Sky-View ( http://iaps.zrc-sazu.si/en/svf#v ). Calcular vários parâmetros de um terreno. É malditamente bom.


-1

O numpy de Gdal_calc parece ter mais operadores :

+ 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

Não encontrei exemplos claros e adequados de como os operadores exóticos devem ser usados. Se você tiver algo, sinta-se à vontade para compartilhar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.