Tornar a área nodata de uma visão geral de ortofoto reamostrada em branco?

9

Eu tenho um conjunto de imagens de ortofoto que são totalmente preenchidas com dados, mas quando colocadas juntas a cobertura não forma um retângulo, portanto há áreas nodata.

No MapGuide, preciso exibir essas áreas de nodata em branco para que meus usuários não precisem desperdiçar tinta preta ao imprimir.

Em grande escala, onde eu exibo imagens originais em alta resolução diretamente, isso não é problema. Acabei de definir a cor de fundo do meu mapa como branca, e as áreas onde não há ortofotos exibem o fundo.

Para desempenho, eu preciso ser capaz de mesclar todas essas imagens de origem em uma imagem geral composta de nova amostra para exibição em escalas menores, onde mais das ortofotografias são visíveis ao mesmo tempo.

Eu tenho tentado usar o GDAL para mesclar e redefinir a amostra da visão geral, mas, por padrão, ele parece criar o bloco GeoTIFF composto com nova amostra com preto nas áreas nodata, e o MapGuide não permite que eu defina o preto como transparente em dispersores de cores.

Existe uma maneira de conseguir o que quero com eficiência?

Eu forneci a resposta que acabei usando o GDAL, mas gostaria de ver soluções usando outros utilitários de processamento de imagem e aplicativos GIS, de código aberto e proprietários.

JasonBirch
fonte

Respostas:

15

A maneira mais fácil de lidar com esse problema foi usar o formato virtual GDAL . Esse formato me permitiu tratar todo o conjunto de imagens como um único objeto de imagem e transformá-lo em três etapas relativamente simples.

Criando o conjunto de dados virtual

O GDAL (incluindo os binários GISInternals do Windows da Tamas Szekeres e versões recentes do OSGeo4W ) inclui um utilitário chamado gdalbuildvrt, que pode ser usado para criar um conjunto de dados virtual inicial.

Uma maneira simples de usar isso é adicionar todas as suas imagens a um arquivo de texto e, em seguida, usar esse arquivo de texto como uma entrada para o gdalbuildvrt. Aqui está um exemplo (você precisará colocar o segundo comando novamente em uma linha):

dir /b *.tif > my_images.txt
gdalbuildvrt 
  -hidenodata 
  -vrtnodata "255 255 255" 
  -resolution highest 
  -input_file_list my_images.txt 
  my_image.vrt

Isso deixará um arquivo XML que você pode tratar como uma imagem única para todas as operações do GDAL. Ele também representa internamente os nodata como brancos, mas oculta a definição de nodata das ferramentas que estão sendo lidas.

Criando a visão geral reamostrada

Em seguida, você realizará a reamostragem e a saída da imagem geral. Você pode fazer isso com gdal_translate ou gdalwarp . Para qualquer um deles, lembre-se de que o tamanho resultante será width * height * 3(número de bandas de 8 bits) bytes. Se o tamanho for maior que 4 GB, convém consultar as opções GeoTIFF para a sintaxe especificar BigTIFF como sua saída (-co "BIGTIFF = YES").

Para gdal_translate, você precisará determinar as dimensões da imagem virtual usando o prático comando gdalinfo . Pegue essas dimensões e divida cada uma por um fator consistente para determinar a largura e a altura de saída do seu arquivo em pixels.

O comando será semelhante a (em uma linha):

gdal_translate
  -outsize 53120 14000
  -co "TILED=YES"
  -co "PROFILE=GEOTIFF"
  -co "BLOCKXSIZE=256"
  -co "BLOCKYSIZE=256"
  my_image.vrt
  my_image.tif

Para gdalwarp, você precisará saber o tamanho de pixel resultante; neste caso, estou usando 0,5 metro. Você também deseja fazer uma chamada no método de reamostragem. Prefiro cubicspline para visões gerais de ortofoto. É mais suave, mas você não vai usá-las até a resolução máxima e, na minha experiência, cria uma imagem mais compressível se estiver usando algo como JPEG ou ECW.

gdalwarp 
  -r cubicspline 
  -of GTiff 
  -dstnodata "255 255 255" 
  -tr 0.5 0.5 
  -co "PROFILE=GEOTIFF" 
  -co "BIGTIFF=YES" 
  -co "TILED=YES" 
  -co "BLOCKXSIZE=256"
  -co "BLOCKYSIZE=256"
  my_image.vrt 
  my_image.tif

Você também pode considerar o uso de opções de compactação JPEG para essas visões gerais GeoTIFF reamostradas; reduz consideravelmente o arquivo de saída, com (de acordo com Frank ) apenas uma penalidade de desempenho marginal.

  -co "COMPRESS=JPEG" 
  -co "JPEG_QUALITY=80" 
  -co "PHOTOMETRIC=YCBCR"

visões gerais

Você também deseja executar o prático comando gdaladdo sobre a imagem resultante para criar "pirâmides" internas, para que solicitações de resoluções mais baixas que as dimensões totais da imagem possam ser atendidas com um subconjunto de dados. O aumento no desempenho vale mais que o espaço em disco na maioria dos casos. Você vai querer brincar com os níveis que você usa aqui; para imagens muito grandes, você pode soltar algumas. O comando gdaladdo é mais ou menos assim:

gdaladdo 
  -r average 
  my_image.tif 
  2 4 8 16 32 64 128 256

Eu sugeriria experimentar esses níveis para obter o desempenho ideal. Você pode achar que um intervalo de reamostragem diferente é melhor para o aplicativo ou, com base no tamanho da imagem, pode eliminar alguns dos números mais altos (ou que são necessários mais)

Além disso, se você estiver gerando uma visão geral externa (usando a opção -ro), considere adicionar as linhas de configuração de compactação JPEG:

  --config COMPRESS_OVERVIEW JPEG 
  --config PHOTOMETRIC_OVERVIEW YCBCR 
  --config INTERLEAVE_OVERVIEW BAND 

(Eu acredito que eles são herdados do GeoTIFF pai para visões gerais incorporadas)

Notas

Ao enfrentar esse problema, perguntei no canal #gdal em freenode.irc.net. Esse é um recurso incrível, e sou muito grato a Howard Butler, Frank Warmerdam e Even Rouault por me ajudarem com isso.

JasonBirch
fonte
Obrigado por estar completo, por dedicar um tempo, e tenho certeza de que estava na hora, para cobrir todo o fluxo de trabalho e não apenas a parte específica que respondeu à pergunta.
Matt Wilkie
11
seria interessante ver se o gdalsetnull.py funciona nos VRTs e, em seguida, "edite o arquivo VRT em um editor de texto, adicionando uma entidade <NoDataValue />" seria desnecessário.
Matt Wilkie
11
@matt wilkie, foi definitivamente um pouco de reescrita e formatação para este site, mas também cobri isso anteriormente como parte de um fluxo de trabalho maior no meu blog: jasonbirch.com/nodes/2009/08/11/11/290/fwtools- ftw-gdal Essa sugestão definitivamente vale a pena tentar!
JasonBirch
general windows cmd note: use caret ^para uma quebra de linha que será unida quando executada (por exemplo, adicione ^no final de cada exemplo de linha de código acima para manter a legibilidade e a capacidade de execução). Ressalva importante: nunca mais terminar uma linha de arquivo ou comando com um acento circunflexo a menos que você deseja chamar consumir toda a memória
Matt Wilkie
3

Sim, mas por tentativa e erro, consegui determinar que o -vrtnodata 255 tem o efeito de sinalizar tudo o que é branco como um nodata, não apenas fora do mapa, que o gdal2tiles então trata com transparência alfa de acordo com o sinalizador -a.

Então, você acaba com algumas das imagens de origem definidas como transparentes, no meu caso, as partes brancas das estradas tracejadas. Este não é um terminal, mas com certeza seria bom poder especificar para a gdal2tiles a cor "no src image", como resultado de vazios originais no vrt ou como resultado de distorção. Para o meu cenário, um tom de azul pálido seria o ideal.

Depois de mais tentativas e erros, parece que hidenodata é a chave. Não sei por que essas ferramentas são tão minimamente documentadas. Aqui está o que funciona para mim, gdal 1.8.

gdalbuildvrt test.vrt -vrtnodata "209 231 245" -hidenodata BX*.tif BY*.tif
gdal2tiles -p raster -s nztm.prj test.vrt out
Peter
fonte
veja também o utilitário gdal nearblack gdal.org/programs/nearblack.html , que trata apenas pixels ao redor da borda da imagem e ignora o meio
matt wilkie
0

Não estou muito familiarizado com o GDAL, mas acho que um método ou comando está disponível onde você pode definir um pixel de determinado valor com outro valor?

Nada a ver com isso, mas no SQL simples algo como (apenas para ilustrar - isso é muito mais pseudo-código):

UPDATE raster SET pixel = 255 WHERE pixel = NoData;

Eu gostaria de saber a resposta!

George Silva
fonte
O GDAL inclui vários métodos para substituir cores por outras cores durante o processamento, de maneira semelhante ao seu pseudocódigo, e um utilitário independente chamado nearblack, que permite limpar as bordas da imagem contendo artefatos de compactação e torná-las brancas, se desejado. Nada disso funcionou bem com o volume de dados com o qual eu estava trabalhando na época.
23410 JasonBirch