Recebo elegantes colinas transparentes através de uma combinação gdal
e 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).
gdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
gdal_tranlate
com uma combinação de -b banda , -mask banda , -desenvolver cinza | rgb | rgba juntos witht a fórmulaopacity=-(px_grey_value)+255
pode ser o caminho a percorrer, mas eu nunca bandas e I'am tocou ainda bastante à nora.Respostas:
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, usandogdal_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 hillshade
produz 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).NoDataValue
os pixels obtêm o padrão nodatavalue0
; também, o preto mais escuro na entrada e na saída é e deve ser1
. Sem banda de opacidade definida, a opacidade é de 100% .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_calc
pode ser usado para fazer cálculos em pixels a partir dos arquivos de entrada A, B, C ... e verificar valores booleanos comoA<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 hillshade
cinzas padrão e as áreas mais brancas tornadas cada vez mais transparentes: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 1
opacidade 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:3. Otimização -b 1 adicional (cortar + escurecer)
Como temos uma banda de opacidade progressiva
-b 2
em que podemos confiar, poderíamos criar-b 1
pixels em branco px = 255 via255*(A>220)
ou preto px = 1 via1*(A>220)
.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 :
Zoom, observe as sombras (antes vs depois):
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
gdal hillshade
saí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.fonte
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
Sombreamento combinado multiplicado com a camada base OSM (opacidade em torno de 50%)
fonte
gdal
+convert
fluxo de trabalho baseadoExiste uma solução
gdal
+convert
que fornece bons resultados visuais. O problema com esta solução é queconvert
destrói informações geográficas que você precisa restaurar. Aumenta o número de ações a serem executadas.Para obter a explicação do comando 4, consulte: https://stackoverflow.com/a/23018544/1974961
fonte