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
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
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
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
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" :
Zoom, por favor, fíjate en las sombras (antes vs. después) :
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.
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órmulaopacidad=-(valor_gris_px)+255
puede ser la solución, pero nunca he tocado las bandas y todavía estoy bastante confundido.0 votos
Añadido tono gris de sombreado para descargar
0 votos
¿Has intentado gdal_edit.py para reescribir las coordenadas, el tamaño de celda y el sistema de referencia?
0 votos
@radouxju: gracias por gdal_edit. En realidad, tu otra respuesta hará el truco, ya que quiero evitar la eliminación o reescritura de metadatos. :)
0 votos
Excelente artículo. ¡Gracias! Mi único problema es que el área plana fuera de la sombra de colina gdal es 181 y no 221. No pude identificar de dónde venía la diferencia... Con este valor de 181, el umbral propuesto es 180-220, lo que no es muy adecuado. Debo elegir valores más bajos, pero luego pierdo un poco la representación en 3D. Pensé en probar el método del "área blanca" que se describe arriba. Pero no entendí cómo debería funcionar la "iluminación".
0 votos
Esto no proporciona una respuesta a la pregunta. Una vez que tengas suficiente reputación, podrás comentar en cualquier publicación; en su lugar, proporciona respuestas que no requieran aclaraciones del que pregunta. - Desde la revisión