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
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 221
para 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.
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)"
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 multiply
valores 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.