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 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 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
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 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 hillshade
cinzas 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
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:
# 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. 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 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
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
- O limite da área plana na
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.
- 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.