¿Cómo crear sombreado compuesto?

10

El concepto de sombreado compuesto es combinar múltiples sombreados con diferente orientación de la luz solar para evitar el punto ciego. Requiere combinar 3 imágenes sombreadas con 315⁰ (luz solar NW, capa predeterminada), capa + 355⁰, luces solares + 275⁰, respectivamente. Esto aumenta los detalles y la elegancia, como se muestra a continuación. Una descripción completa que no es SIG está aquí .

ingrese la descripción de la imagen aquí

Usando cualquier archivo srtm, los 3 sombreados iniciales se pueden hacer a través de:

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
fuente

Respuestas:

9

La fuente vinculada menciona "cambiar su modo de fusión a <Multiplicar>" , por lo que la operación a realizar no es un simple promedio de sombreados de entrada (para esto, vea también ¿Cómo promediar gdal_hillshades? ). Es otra cosa. Sin embargo, creemos las 3 sombras de las diferentes direcciones de la 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

ingrese la descripción de la imagen aquí

Mantenga el valor más bajo de A, B, C

El primer algoritmo sobre el que pensé es filtrar y mantener los píxeles más oscuros, es decir, los píxeles con valores más bajos entre las entradas A, B, CA booleanas pueden hacer eso:

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

El área dominada por las sombras ahora conforman más que el lado opuesto de un enlace central, se ha incrementado en 40⁰ en cada lado. No como el enlace proporcionado, este algoritmo actual parece perder demasiado el área de iluminación.

Ángulo de 315±30⁰(variación de ángulo menor) en lugar de que la corriente 315±40⁰sería mejor.

El siguiente diagrama es la base de la ecuación. Muestra las fuentes de luz A, B, C y las comparaciones booleanas para los valores de píxeles A, B, C en cada parte. Las líneas de igualdad necesitan una atención especial para ser incluidas en el booleano. Las líneas medianas tienen valor 221para la fuente de luz perpendicular. Piense en las áreas de influencia , la fuente de luz más cercana es la influencia principal, y la más débil es la influencia más débil.

ingrese la descripción de la imagen aquí

Mantener valores extremos para A, B, C

Otro algoritmo booleano podría ser mantener los valores más extremos, tanto los píxeles más oscuros como los más blancos. El siguiente diagrama ayuda a pensar en la fórmula booleana. Para cada sexto del círculo, identifica el valor que se debe mantener de A, B, C y un valor booleano para seleccionar el área triangular más la línea de igualdad en el sentido de las agujas del reloj, y solo eso . Da (desde arriba y en sentido horario):

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

ingrese la descripción de la imagen aquí

Si las variaciones de los ángulos no son demasiado importantes, podría dar buenos resultados.

Otros booleanos

Puede crear un booleano más complejo para cubrir los círculos completos usando cualquier combinación de los segmentos de borde. Sigue siendo importante que solo se mantenga un valor de A, B, C para un segmento.

Multiplicar

Hice varios intentos fallidos de multiplyvalores de píxeles sin una fórmula probada ni éxito final. @Radouxju señaló que (a*b*c)^(1/3)(la media GEOMÉTRICA) en lugar de la media ARITMÉTICA (a*b*c)/(255*255)puede funcionar. La media geométrica es inferior o igual a la media aritmética, lo que acentúa la oscuridad de las áreas sombreadas. Aún no lo he probado.

Hugolpz
fuente
Traté de resumir mi aprendizaje conceptual sobre el compuesto y cómo alguien podría personalizarlo. La verdadera fórmula para "multiplicar" sigue siendo desconocida para mí.
Hugolpz
¿Por qué no simplemente multiplicar los valores y reescalar los resultados?
whuber
No lo he intentado! ¿Qué fórmula lo haría (A*B*C)/(255*255)?
Hugolpz
1
Ese sería un buen comienzo :-).
whuber
1
no es "multiplicar" usando la media GEOMÉTRICA en lugar de la media ARITMÉTICA. (a b c) ^ (1/3). La media geométrica es inferior o igual a la media aritmética, lo que acentúa la oscuridad de las áreas sombreadas.
radouxju
0

Una herramienta que puede hacer esto (entre otras) es la Visualización basada en factores de Sky-View ( http://iaps.zrc-sazu.si/en/svf#v ). Calcular varios parámetros de un terreno. Es muy bueno

Dimitris Poursanidis
fuente
-1

El numpy de Gdal_calc parece tener más 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

No he encontrado ejemplos claros y adecuados de cómo deberían usarse los operadores exóticos. Si tienes algo, no dudes en compartirlo.

Hugolpz
fuente