¿Crear sombreado transparente?

34

Obtengo elegantes sombreados transparentes mediante una combinación gdaly convert. En comparación con el sombreado basado en gris que se usa comúnmente, estos sombreados transparentes son muy geniales porque se pueden colocar entre el fondo del mapa y otras capas superiores (carreteras, edificios) para proporcionar una sensación 3D independientemente del tipo y color del fondo.

Cómo funciona

El truco: comenzando con una sombra de escala de grises producida por gdal hillshade, el truco consiste en tomar los valores del canal gris, invertir cada valor y transferir este resultado a un nuevo canal de opacidad. El píxel negro [0,0,0] se convierte en [0,0,0,255] (opacidad = 255), el píxel gris [120,120,120] se vuelve más bajo [120,120,120,135] (opacidad = 135, también conocido como 255-120), el píxel blanco [255,255,255] hacerse transparente [255,255,255,0] (opacidad = 0, también conocido como 255-255) y así sucesivamente. Los tonos de las colinas son opacos y negros , las llanuras se vuelven progresivamente (blancas) transparentes . Conceptualmente, la ecuación de banda del píxel es algo así:

alpha_value([0])    = 255-0 = 255;   // black pixels get full opacity
alpha_value([Grey]) = 255-Grey;
// grey pixels get 255-GreyValue opacity.
alpha_value([255])  = 255-255 = 0  // white pixels get null opacity !

Para ver un video relajado sobre este enfoque, explicado por un diseñador de Photoshop, vea Agregar relieve sombreado en Photoshop (16 minutos).

Pregunta

Tomar un ETOPO o SRTM derivada de sombreado a base de gris ( gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, archivos disponibles para descargar aquí ) como entrada ...

... ¿Cómo hacer el truco citado superior a través de gdal u otra forma no destructiva de GIS en tales archivos .tif?

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

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

Hugolpz
fuente
1
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.
Steve
@Steve: es para archivos .tif generados a partir de ráster como SRTM o ETOPO después degdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
Hugolpz
Creo que gdal_tranlatecon una combinación de -b band , -mask band , -expand gray | rgb | rgba junto con la fórmula opacity=-(px_grey_value)+255puede ser el camino a seguir, pero nunca toqué las bandas y todavía estoy bastante despistado.
Hugolpz
¿Has probado gdal_edit.py para reescribir la coordenada, el tamaño de celda y el sistema de referencia?
radouxju

Respuestas:

42

Cáscara de nuez

Cada conjunto de 3 imágenes a continuación debe leerse como "gris (banda) + opacidad (banda) = resultado transparente" . Puede probar estos procesos en minutos a través del archivo MAKE hospedado github asociado . El proceso n. ° 3 es el que recomiendo, con un umbral entre 170 (mantiene sombras fuertes) y 220 (mantiene todas las sombras). El proceso 3 proporciona las sombras más fuertes y evita el efecto de blanqueamiento grisáceo. Adapte la opacidad general de la capa resultante según sea necesario. Las ecuaciones también --calc="<equation>"pueden mejorarse según sea necesario, utilizando gdal_calc.

Para ver un video relajado sobre este enfoque, explicado por un diseñador de Photoshop, vea Agregar relieve sombreado en Photoshop (16 minutos).

Fondo

gdaldem hillshadeproduce un archivo de escala de grises de una banda con un rango de valores de píxeles = [1-255], es decir, desde las sombras más oscuras hasta el píxel más iluminado. Para áreas planas, px = 221 (#DDDDDD). NoDataValuelos píxeles obtienen el valor de nodata predeterminado 0, también, el negro más oscuro en la entrada y en la salida es y debería ser 1. Sin una 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 el sombreado. Fuera de gdal, es una banda gris con rango continuo como px = [1-255]. Podemos recortar áreas no relevantes (# 2), o oscurecerlo a px = 1 y confiar en la banda de opacidad (# 3).

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

gdal_calcse puede usar para hacer cálculos matemáticos en píxeles de los archivos de entrada A, B, C ... y verificar 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. Sombreado gris hecho transparente

Lo siguiente proporciona resultados muy buenos de dos bandas con los gdal hillshadegrises estándar y las áreas más blancas 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 pseudocultivo (-b 1 y -b 2)

2/3 de los píxeles en -b 1(escala de grises) se vuelven invisibles a simple vista cuando -b 2se agrega la opacidad , sin embargo, estos píxeles mantienen varios valores de -b 1opacidad más blancos y bajos -b 2. Se pueden hacer todos los [255,1]píxeles transparentes blancos , 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 (recortado) # 2, opacity.tif (recortado) # 2, final_crop.tif

3. Optimización adicional -b 1 (recorte + ennegrecimiento)

Dado que tenemos una banda de opacidad progresiva -b 2en la que podemos confiar, podríamos hacer -b 1píxeles, ya sea blanco px = 255 255*(A>220)o negro px = 1 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 (recortado) # 3, final.tif

Este resultado muestra sombras más fuertes .

Resultado

Crear un sombreado transparente tiene como objetivo inmediato eliminar las antiguas áreas grises de la llanura y el efecto de desvanecimiento canoso no deseado pero ubicuo asociado . 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 plana de fondo colorido mantendrá los colores elegidos cuando se superpongan las sombras transparentes a negras, solo las áreas sombreadas se oscurecerán. Comparación del proceso # 2 (izquierda) y # 3 (derecha) a continuación.

Visión general :

Comparación del proceso n. ° 2 (izquierda) y n. ° 3 (derecha), vista general.

Zoom, observe las sombras (antes vs después):

Comparación del proceso # 2 (izquierda) y # 3 (derecha), vista de detalles.

Otras optimizaciones

Áreas blancas : también es posible que desee mantener las áreas más iluminadas para aumentar la sensación 3D. Literalmente sería la simétrica de este enfoque actual con pequeños cambios de umbral, luego una fusión de ambas salidas a través de gdal_calc. La llanura sería 100% transparente, las sombras más oscuras y las áreas iluminadas más claras opacas.

Suavizado: el sombreado de entrada se puede suavizar previamente para obtener un mejor resultado final, consulte ¿ Suavizar DEM usando GRASS?

Sombreado compuesto ( ¿Cómo crear sombreado compuesto? ).

Bumped hillhade también es interesante ( descripción )

Notas

  • El umbral del área plana en la gdal hillshadesalida es px = 221 (#DDDDDD = [221,221,221]), marcando áreas planas. Además, el sombreado px = 221 divide las imágenes entre las pendientes en la sombra (A <221) y las pendientes en la luz (A> 221) píxeles.
  • Un umbral de procesamiento en px = [170-220] como probado, mantiene cerca del 100% de las sombras perceptibles de los ojos, que apenas representan el 15-35% del área de alivio.
  • Tamaño de 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, ¡80% de ahorro!
  • Tamaño de archivo> recorte: desde .326 KB en el n. ° 1, el color y la opacidad del recorte (n. ° 2) llegan a 310 kb, el color ennegrecido (n. ° 3) llega a 160 kb. El efecto de recorte en el tamaño del archivo está entre 5 ~ 50% de reducción con umbral en px = 220 y mi entrada.
Hugolpz
fuente
2
Alentador +1 bienvenido.
Hugolpz
2
Tutorial terminado. Mi inglés puede estar roto, siéntase libre de mejorar.
Hugolpz
3
Si bien tuvo que responderse a sí mismo, este hilo es un excelente tutorial que aborda muchas preguntas sobre sombreado. ¡Bien hecho!
Kersten
Tu tutorial es solo trabajo. Buen trabajo. ¿Podría por favor considerar responder mi pregunta => aquí ? ¿Es posible crear .ovr para este tipo de GeoTIFF, escala de grises con banda alfa?
Sandthorn
1
Hola @sandthorn, a pesar de mi amor, ya no estoy en este campo. El costo para encontrar la respuesta probablemente será mayor para mí-2018 que para usted-2018. ¡Espero que mis cosas apunten a la dirección correcta para su problema!
Hugolpz
7

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

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

gdaldem hillshade -combined -compute_edges infile outfile.tif

Luego use un modo de composición de capas múltiples para "cubrir" esto sobre otras capas.

Sombreado estándar / combinado

Sombreado estándar

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

Robar
fuente
2

gdal+ convertflujo de trabajo basado

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

# Basic crop
gdal_translate -projwin 67 35.92 99 5 ../data/noaa/ETOPO1_Ice_g_geotiff.tif crop_xl.tmp.tif
# Grey-based hillshade
gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
# create a transparent hillshade:
convert shadedrelief.tmp.tif -fuzz 7% -fill "#FFFFFF" -opaque "#DDDDDD"  whited.jpg # makes all grey values white to lighten the filesize
convert whited.jpg -alpha copy -channel alpha -negate +channel trans.png # <=== TRICK HERE.
# Restore georeferencing & reproject            
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
# Compress from 11MB to 2MB:
gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./trans_reproj.tmp.gis.tif ./trans.gis.tif

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

Hugolpz
fuente