Criando uma colina transparente?

34

Recebo elegantes colinas transparentes através de uma combinação gdale convert. Compare com as colinas cinza usadas normalmente, essas colinas transparentes são muito legais porque podem ser colocadas entre o plano de fundo do mapa e outras camadas superiores (estradas, construção) para proporcionar uma sensação 3D em qualquer que seja o tipo e a cor do plano de fundo.

Como funciona

O truque: começando com uma colina em escala de cinza produzida por gdal hillshade, o truque é pegar os valores do canal cinza, inverter cada valor e transmitir esse resultado para um novo canal de opacidade. Pixel preto [0,0,0] torna-se [0,0,0,255] (opacidade = 255), pixel cinza [120,120,120] diminui tornando-se [120,120,120,135] (opacidade = 135, também conhecido como 255-120), pixel branco [255,255,255] tornar-se transparente [255,255,255,0] (opacidade = 0, aka 255-255) e assim por diante. As sombras de Hills são opacas e negras , as planícies se tornam progressivamente (brancas) transparentes . Conceitualmente, a equação de banda do pixel é algo como:

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 um vídeo descontraído sobre essa abordagem, explicado por um designer do Photoshop, consulte Adicionando alívio sombreado no Photoshop (16 minutos).

Questão

Tomando como base uma colina cinzenta derivada de ETOPO ou SRTM ( gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, arquivo disponível para download aqui ) como entrada ...

... Como fazer o truque citado acima via gdal ou outra maneira não destrutiva de GIS nesses arquivos .tif?

Observe que eu desejo manter as propriedades do GIS (geolocalização).

insira a descrição da imagem aqui insira a descrição da imagem aqui

Hugolpz
fonte
11
Dependendo de como os dados de referência são armazenados no tiff, pode ser tão fácil quanto renomear o arquivo mundial associado ao tiff.
Steve
@ Steve: é para .tif gerada a partir de raster tais SRTM ou ETOPO depoisgdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
Hugolpz
Eu acho que gdal_tranlatecom uma combinação de -b banda , -mask banda , -desenvolver cinza | rgb | rgba juntos witht a fórmula opacity=-(px_grey_value)+255pode ser o caminho a percorrer, mas eu nunca bandas e I'am tocou ainda bastante à nora.
Hugolpz
adicionado hillshade cinza para download
Hugolpz
você tentou gdal_edit.py reescrever a coordenada, o tamanho da célula e o sistema de referência?
Radouxju

Respostas:

42

Casca de noz

Cada conjunto de 3 imagens abaixo deve ser lido como "cinza (banda) + opacidade (banda) = resultado transparente" . Você pode testar esses processos em questão de minutos através do makefile hospedado no github associado . O processo nº 3 é o que eu recomendo, com um limite entre 170 (mantém sombras fortes) e 220 (mantém todas as sombras). O processo 3 fornece as sombras mais fortes e evita o efeito de clareamento de cinza. Adapte a opacidade geral da camada resultante, conforme necessário. As equações --calc="<equation>"podem também ser aprimoradas conforme necessário, usando gdal_calc.

Para um vídeo descontraído sobre essa abordagem, explicado por um designer do Photoshop, consulte Adicionando alívio sombreado no Photoshop (16 minutos).

fundo

gdaldem hillshadeproduz um arquivo de escala de cinza de uma banda com valores de pixels range = [1-255], também conhecido como das sombras mais escuras ao pixel mais iluminado. Para áreas planas, px = 221 (#DDDDDD). NoDataValueos pixels obtêm o padrão nodatavalue 0; também, o preto mais escuro na entrada e na saída é e deve ser 1. Sem banda de opacidade definida, a opacidade é de 100% .

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

hillshade.tmp.tif

Queremos definir e controlar uma segunda banda de opacidade!

Objetivos

Queremos uma banda em escala de cinza -b 1 , é a colina. Fora da gdal, é uma faixa cinza com faixa contínua como px = [1-255]. Podemos cortar áreas não relevantes (nº 2) ou escurecer para px = 1 e confiar na banda de opacidade (nº 3).

Queremos uma banda de opacidade -b 2 , geralmente o invertido da colina ou uma função relacionada a ela. Podemos cortar áreas não relevantes (# 2). Deve haver uma gama contínua de opacidades, como px = [1-255], caso contrário não há elegância.

gdal_calcpode ser usado para fazer cálculos em pixels a partir dos arquivos de entrada A, B, C ... e verificar valores booleanos como A<220, que retorna 1 (verdadeiro) ou 0 (falso). Isso permite cálculo condicional. Se a condição for falsa, a parte relacionada da equação será anulada.

1. Colina cinza transparente

A seguir, são apresentados excelentes resultados de duas bandas com os gdal hillshadecinzas padrão e as áreas mais brancas tornadas cada vez mais 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. Otimização via pseudo-colheita (-b 1 e -b 2)

2/3 dos pixels em -b 1(escala de cinza) ficam invisíveis a olho nu quando a opacidade -b 2é adicionada; no entanto, esses pixels mantêm vários valores de -b 1opacidade mais brancos e baixos -b 2. Eles podem ser feitos com todos os [255,1]pixels transparentes brancos , permitindo uma melhor taxa de compactação:

# 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 (cortada) # 2, opacity.tif (cortada) # 2, final_crop.tif

3. Otimização -b 1 adicional (cortar + escurecer)

Como temos uma banda de opacidade progressiva -b 2em que podemos confiar, poderíamos criar -b 1pixels em branco px = 255 via 255*(A>220)ou preto px = 1 via 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 (cortada) # 3, final.tif

Este resultado mostra sombras mais fortes .

Resultado

Criar uma sombra de colina transparente tem como objetivo imediato remover as áreas cinzas anteriores da planície e o efeito desbotado, porém onipresente, associado ao desbotamento da cor cinza. O subproduto desejado é um maior controle sobre o produto visual final. O processo descrito remove a maioria dos pixels cinza e todos os brancos. A imagem simples de plano de fundo colorido manterá as cores escolhidas quando sobreposta pelas colinas transparentes ao preto, apenas as áreas sombreadas serão escurecidas. Comparação do processo nº 2 (esquerda) e nº 3 (direita) abaixo.

Visão global :

Comparação do processo nº 2 (esquerda) e nº 3 (direita), visão geral.

Zoom, observe as sombras (antes vs depois):

Comparação do processo nº 2 (esquerda) e nº 3 (direita), exibição de detalhes.

Otimizações adicionais

Áreas brancas : também é possível manter as áreas mais iluminadas para aumentar a sensação 3D. Seria literalmente o simétrico dessa abordagem atual com pequenas alterações de limite e, em seguida, uma mesclagem de ambas as saídas via gdal_calc. A planície seria 100% transparente, as sombras mais escuras e as áreas mais claras iluminadas, opacas.

Suavização: a colina de entrada pode ser pré-suavizada para obter um melhor resultado final, consulte Suavização do DEM usando GRASS?

Colina composta ( como criar colina composta? ).

O colina colidida também é interessante ( descrição )

Notas

  • O limite da área plana na gdal hillshadesaída é px = 221 (#DDDDDD = [221.221.221]), marcando áreas planas. Além disso, px = 221 do hillshade divide as imagens entre os declives na sombra (A <221) e os declives na luz (A> 221) em pixels.
  • Um limiar de processamento em px = [170-220] como comprovadamente bom, mantém perto de 100% das sombras visíveis nos olhos, que mal representam 15-35% da área de alívio.
  • Tamanho do arquivo > Compactação: final.tif de # 1, # 2, # 3 é ~ 1,3 MB sem compactação, depois ~ 0,3-0,16 MB após a compactação, economia de 80%!
  • Tamanho do arquivo > corte: de .326KB no número 1, a cor e a opacidade do corte (nº 2) chegam a 310kb, a cor preta (nº 3) chega a 160kb. O efeito de corte no tamanho do arquivo está entre uma redução de 5 a 50% com o limite em px = 220 e minha entrada.
Hugolpz
fonte
2
Incentivando +1 de boas-vindas.
Hugolpz
2
Tutorial finalizado. Meu inglês pode estar quebrado, fique à vontade para melhorar.
Hugolpz 5/05
3
Embora você tenha que responder a si mesmo, este tópico é um excelente tutorial, abordando muitas perguntas sobre sombreamento. Bem feito!
Kersten #
Seu tutorial é apenas trabalho. Ótimo trabalho. Você poderia, por favor, considerar responder minha pergunta => aqui ? É possível criar .ovr para esse tipo de GeoTIFF, em escala de cinza com banda alfa?
Sandthorn
11
Olá @sandthorn, apesar do meu amor por ele, não estou mais nesse campo. O custo para encontrar a resposta provavelmente será maior para mim-2018 do que para você-2018. Espero que minhas coisas aponte para a direção certa para o seu problema!
Hugolpz 28/08
7

Outra maneira de obter o mesmo resultado de uma tela não cinza mais adequada para combinar com outras camadas é a opção 'combinada' no gdaldem.

Ele executa uma sombra de inclinação e colina e combina os dois em uma operação. Áreas de inclinação 0 são brancas. Áreas com inclinação de 90 graus são negras para a sombra da inclinação, com alguma iluminação adicionada pela camada da colina.

gdaldem hillshade -combined -compute_edges infile outfile.tif

Em seguida, use um modo de composição de múltiplas camadas para 'drapejar' isso sobre outras camadas.

Escalada padrão / combinada

Padrão Hillshading

Sombreamento combinado multiplicado com a camada base OSM (opacidade em torno de 50%) Sombreamento combinado multiplicado pela camada base do OSM

Roubar
fonte
2

gdal+ convertfluxo de trabalho baseado

Existe uma solução gdal+ convertque fornece bons resultados visuais. O problema com esta solução é que convertdestrói informações geográficas que você precisa restaurar. Aumenta o número de ações a serem executadas.

# 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 obter a explicação do comando 4, consulte: https://stackoverflow.com/a/23018544/1974961

Hugolpz
fonte