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 hillshade
produce 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). NoDataValue
los 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
¡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_calc
se 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 hillshade
grises 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
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 2
se agrega la opacidad , sin embargo, estos píxeles mantienen varios valores de -b 1
opacidad 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
3. Optimización adicional -b 1 (recorte + ennegrecimiento)
Dado que tenemos una banda de opacidad progresiva -b 2
en la que podemos confiar, podríamos hacer -b 1
pí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
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 :
Zoom, observe las sombras (antes vs después):
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 hillshade
salida 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.