37 votos

¿Cómo crear una sombra de colina transparente?

Obtengo sombras de colina elegantes y transparentes mediante una combinación de gdal y convert. En comparación con las sombras de colina basadas en gris comúnmente utilizadas, estas sombras transparentes son muy geniales porque se pueden colocar entre el fondo del mapa y otras capas superiores (carreteras, edificios) para proporcionar una sensación tridimensional sin importar el tipo y color del fondo.

Cómo funciona

El truco: Comenzando con una sombra de colina en escala de grises producida por gdal hillshade, el truco es tomar los valores del canal de gris, invertir cada valor y fluir este resultado en un nuevo canal de opacidad. Los píxeles negros [0,0,0] se convierten en [0,0,0,255] (opacidad=255), los píxeles grises [120,120,120] se vuelven más bajos convirtiéndose en [120,120,120,135] (opacidad=135, es decir 255-120), los píxeles blancos [255,255,255] se vuelven transparentes [255,255,255,0] (opacidad=0, es decir 255-255) y así sucesivamente. Las sombras de las colinas son opacas y negras, las llanuras se vuelven progresivamente (blanco) transparente. Conceptualmente, la ecuación de banda de píxeles es algo así:

valor_alpha([0])    = 255-0 = 255;   // los píxeles negros obtienen opacidad total
valor_alpha([Gris]) = 255-Grey;
// los píxeles grises obtienen opacidad de 255-ValorGris.
valor_alpha([255])  = 255-255 = 0  // los píxeles blancos obtienen opacidad nula !

Para ver un video relajado sobre este enfoque, explicado por un diseñador de Photoshop, ve Cómo añadir relieve sombreado en Photoshop (16mins).

Pregunta

Tomando una sombra de colina basada en gris derivada de ETOPO o SRTM (gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, archivo disponible para descargar aquí) como entrada...

...¿Cómo hacer el truco citado anteriormente a través de gdal o de otra manera no destructiva de GIS en archivos .tif como este?

Tenga en cuenta que deseo mantener las propiedades de GIS (geolocalización).

introducir la descripción de la imagen aquí introducir la descripción de la imagen aquí

1 votos

Dependiendo de cómo se almacenan los datos de referencia en el tiff, puede ser tan fácil como renombrar el archivo mundial asociado con el tiff.

0 votos

@Steve: es para archivos .tif generados a partir de ráster como SRTM o ETOPO después de gdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges

0 votos

Creo que gdal_translate con una combinación de -b cinta, -máscara cinta, -expandir gris|rgb|rgba junto con la fórmula opacidad=-(valor_gris_px)+255 puede ser la solución, pero nunca he tocado las bandas y todavía estoy bastante confundido.

48voto

ohzeadae Puntos 65

Nutshell

Cada conjunto de 3 imágenes de abajo debe ser leído como "gris (banda) + opacidad (banda) = resultado transparente" . Puede probar estos procesos en cuestión de minutos a través del makefile alojado en github . Proceso #3 es el que recomiendo, con un umbral entre 170 (mantiene las sombras fuertes) y 220 (mantiene todas las sombras). El proceso 3 proporciona las sombras más fuertes y evitar efecto blanqueador de las canas. Adapte la opacidad general de la capa resultante según sea necesario. Las ecuaciones de --calc="<equation>" también puede mejorarse según sea necesario, utilizando gdal_calc .

Para ver un vídeo relajado sobre este enfoque, explicado por un diseñador de Photoshop, vea Añadir relieve sombreado en Photoshop (16 minutos).

Antecedentes

gdaldem hillshade produce un archivo de escala de grises de una banda con valores de píxeles en el rango=[1-255], es decir, desde las sombras más oscuras hasta el píxel más iluminado. Para las zonas planas, px=221 (#DDDDDD). NoDataValue píxeles obtienen el valor nodal por defecto 0 Además, el negro más oscuro en la entrada y en la salida es y debe ser 1 . Sin banda de opacidad definida, La opacidad es del 100%. .

gdaldem hillshade input.tif hillshade.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges

hillshade.tmp.tif

Queremos definir y controlar una segunda banda de opacidad.

Objetivos

Queremos una banda en escala de grises -b 1 Es la sombra de la colina. Fuera de gdal, es una banda gris con rango continuo como px=[1-255]. Podemos recortar las áreas no relevantes (#2), o ennegrecerla a px=1 y confiar en la banda de opacidad (#3).

Queremos una banda de opacidad -b 2 , generalmente la inversa de la sombra de la colina o una función relacionada con ella. Podemos recortar las áreas no relevantes (#2). Debe ser un rango continuo de opacidades como px=[1-255], de lo contrario no hay elegancia.

gdal_calc se puede utilizar tanto para hacer cálculos sobre los píxeles de los archivos de entrada A,B,C... como para comprobar valores booleanos como A<220 que devuelve 1 (verdadero) o 0 (falso). Esto permite el cálculo condicional. Si la condición es falsa, la parte relacionada de la ecuación se anula.

1. Sombra gris convertida en transparente

A continuación se ofrecen unos resultados muy buenos en dos bandas con la norma gdal hillshade Los grises y las zonas más blancas se vuelven cada vez más transparentes:

# 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

hillshade.tmp.tif #1, opacity.tif #1, final.tif

2. Optimización mediante pseudo-recogida (-b 1 y -b 2)

2/3 de los píxeles en -b 1 (escala de grises) se vuelven invisibles a simple vista cuando la opacidad -b 2 se añade, sin embargo, estos píxeles mantiene varios más blanco -b 1 y baja opacidad -b 2 valores. Se pueden hacer transparentes todos los blancos [255,1] píxeles, lo que permite una mejor tasa de compresión:

# 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

#2, color.tif   (cropped) #2, opacity.tif (cropped) #2, final_crop.tif

3. Más -b 1 optimización (recorte + ennegrecimiento)

Como tenemos una banda de opacidad progresiva -b 2 para confiar, podríamos hacer -b 1 píxeles ya sea blanco px=255 a través de 255*(A>220) o negro px=1 mediante 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

#3, color.tif #2, opacity.tif (cropped) #3, final.tif

Este resultado muestra sombras más fuertes .

Resultado

Crear una sombra de colina transparente tiene como objetivo inmediato eliminar las antiguas zonas grises de la llanura y las asociadas no deseado pero omnipresente efecto de encanecimiento. El subproducto deseado es un mayor control sobre el producto visual final. El proceso descrito elimina la mayoría de los píxeles grises y todos los blancos. La imagen lisa de fondo de color mantendrá sus colores elegidos cuando se superponga a las sombras de colina transparentes a negras, sólo las zonas de sombra se oscurecerán. Comparación del proceso #2 (izquierda) y #3 (derecha) a continuación.

Resumen "Antes y después" :

Comparison of process #2 (left) and #3 (right), general view.

Zoom, por favor, fíjate en las sombras (antes vs. después) :

Comparison of process #2 (left) and #3 (right), details view.

Otras optimizaciones

Zonas blancas : También se puede desear mantener las zonas más iluminadas para aumentar la sensación de 3D. Sería literalmente la simetría de este enfoque actual con pequeños cambios de umbral, y luego una fusión de ambas salidas a través de gdal_calc. El plano sería 100% transparente, las sombras más oscuras y las zonas más iluminadas opacas.

Alisado: La sombra de la colina de entrada puede ser pre-alisada para obtener un mejor resultado final, ver ¿Suavizar el MDE con GRASS?

Sombrilla compuesta ( ¿Cómo crear una sombra compuesta? ).

Sombreado de la colina con baches también es interesante ( descripción )

Notas

  • El umbral de área plana en gdal hillshade La salida es px=221 (#DDDDDD = [221,221,221]), marcando zonas planas. Además, el px=221 de hillshade divide las imágenes entre los píxeles de las pendientes en sombra (A<221) y las pendientes en luz (A>221).
  • A umbral de procesamiento a px=[170-220] como se ha demostrado que es bueno, mantiene casi el 100% de las sombras que se notan en los ojos, que a su vez apenas representan el 15-35% del área de relieve.
  • Tamaño del archivo > Compresión: final.tif de #1, #2, #3 es ~1.3MB sin compresión, luego ~0.3-0.16MB después de la compresión, ¡un ahorro del 80%!
  • Tamaño del archivo > recorte: De los 326KB en el #1, recortar el color y la opacidad (#2) llegan a 310kb, ennegrecer el color (#3) llegan a 160kb. El efecto del recorte en el tamaño de los archivos está entre el 5~50% de reducción con el umbral en px=220 y mi entrada.

2 votos

Fomentando +1 bienvenido.

3 votos

Mientras que tuviste que responderte a ti mismo en este hilo, este es un excelente tutorial que aborda muchas preguntas sobre el sombreado de colinas. ¡Bien hecho!

0 votos

Tu tutorial es simplemente genial. ¡Gran trabajo! ¿Podrías por favor considerar responder mi pregunta => aquí? ¿Es posible crear un archivo .ovr para este tipo de GeoTIFF, en escala de grises con banda alfa?

8voto

Rob Puntos 51

Otra forma de obtener el mismo resultado de un lienzo no gris más adecuado para combinar con otras capas es la opción 'combinado' en gdaldem.

Realiza una pendiente y una sombra de colina y combina las dos en una sola operación. Las áreas con una pendiente de 0 son blancas. Las áreas con una pendiente de 90 grados son negras para la sombra de pendiente, con algo de iluminación añadida por la capa de sombreado de la colina.

gdaldem hillshade -combined -compute_edges archivo_entrada archivo_salida.tif

Luego usa un modo de composición de capa de multiplicación para 'superponer' esto sobre otras capas.

Sombreado estándar/combinado de colinas

Sombreado estándar de colinas

Sombreado combinado multiplicado con la capa base de OSM (opacidad alrededor del 50%) Sombreado combinado multiplicado con la capa base de OSM

0 votos

¿Hay alguna forma de combinar la capa de OSM con la capa de sombreado de colinas con gdal?

3voto

ohzeadae Puntos 65

gdal + convert basado en flujo de trabajo

Hay una solución gdal + convert que da buenos resultados visuales. El problema con esta solución es que convert destruye la información geográfica que luego tienes que restaurar. Aumenta el número de acciones a ejecutar.

# Recorte básico
gdal_translate -projwin 67 35.92 99 5 ../data/noaa/ETOPO1_Ice_g_geotiff.tif crop_xl.tmp.tif
# Sombreado basado en gris
gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
# crear un sombreado transparente:
convert shadedrelief.tmp.tif -fuzz 7% -fill "#FFFFFF" -opaque "#DDDDDD"  whited.jpg # hace que todos los valores de gris sean blancos para reducir el tamaño del archivo
convert whited.jpg -alpha copy -channel alpha -negate +channel trans.png # <=== TRUCO AQUÍ.
# Restaurar georeferenciación y reproyectar            
gdal_translate -a_ullr 67 35.92 99 5 trans.png trans.tmp.gis.tif
gdalwarp -s_srs EPSG:4326 -t_srs ESPG:3857 ./trans.tmp.gis.tif ./trans_reproj.tmp.gis.tif
# Comprimir de 11MB a 2MB:
gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./trans_reproj.tmp.gis.tif ./trans.gis.tif

Para explicación del comando 4, ver: https://stackoverflow.com/a/23018544/1974961

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X