Como adicionar interpretação de cores para bandas raster usando GDAL?

9

Eu tenho 3 arquivos GeoTIFF de 1 banda separados. A interpretação das cores da banda é cinza. Eu quero um arquivo RGB de 3 bandas. Eu usei gdal_merge.py

gdal_merge.py -separate file1.tif file2.tif file3.tif -o output_file.tif

Mas a interpretação de cores para as 3 bandas do arquivo_de_ saída resultante é cinza, indefinida, indefinida. Além disso, todos os pixels são 0 .

Se eu executar pct2rgb.py, recebo um arquivo RGB:

pct2rgb.py output_file.tif output_file_rgb.tif

Mas é claro que os pixels também são 0. Então, eu tenho 3 perguntas:

  • O gdal_merge.py é a ferramenta certa para combinar 3 arquivos de 1 banda em um arquivo RGB de 3 bandas?
  • Por que estou recebendo uma interpretação de cores indefinida para bandas?
  • O pct2rgb é a ferramenta certa para transformar arquivos de 3 bandas com essa interpretação de cores em arquivos RGB?

ATUALIZAÇÃO : Os rasters não possuem uma tabela de cores. Apenas interpretação de cores: cinza.

Por outro lado, os valores de pixel variam de 0 a 1023 (isso é deliberado)

Mais dados: são rasters rotacionados (sem norte para cima), mas todos eles têm a mesma geotransformação.

ATUALIZAÇÃO 2 : Posso distorcer as imagens para chegar ao norte, construir um VRT e adicionar ColorInterp para cada banda, mas ainda assim a interpretação das cores é cinza, indefinida e indefinida no resultado da saída.

O problema é que preciso criar uma tabela de cores, pelo menos, na primeira banda. Conheço a maneira de criá-los , mas não sei quantas entradas minha tabela deve ter. Por que existem 13 entradas no exemplo das Perguntas frequentes do GDAL Raster? Todos os pixels têm valores entre 0 e 1023, se ajudar.

ATUALIZAÇÃO 3 : Aparentemente, no formato TIFF não há como especificar realmente a interpretação das cores de cada banda. A maneira como o GDAL constrói a interpretação das cores ao ler um arquivo TIFF é uma combinação do valor da tag PHOTOMETRIC e EXTRASAMPLES .

Lendo sobre essas tags:

  • PHOTOMETRIC representa o espaço de cores dos dados da imagem. Um valor 2 significa que os componentes de um valor de pixel são RGB, mas ele assume pixels de bytes e eu tenho UInt16 pixels (tentei -co "PHOTOMETRIC=rgb"e obtive um erro). Portanto, não posso especificar a tag PHOTOMETRIC para o arquivo de saída.

  • EXTRASAMPLES especifica que cada pixel tem N componentes extras. Não tenho certeza sobre como usar essa tag para criar meu arquivo mesclado. Ou se eu precisar.

Então, na atualização 2, sugiro a criação de uma ColorTable, mas como? Nos meus 3 arquivos de entrada, os valores de pixel variam de 0 a 1023. Preciso combiná-los com cores? Preciso criar uma ColorTable com 1024 entradas? Como?

Na atualização 3, parece que eu poderia usar algumas tags GeoTIFF ao criar o arquivo mesclado, mas não tenho certeza se realmente posso usá-las ou como.

Jorge Arévalo
fonte
11
Tente o seguinte: use gdal_merge como você fez e gdal_translate -co PHOTOMETRIC = RGB, por qualquer motivo, gdal_merge não honra o -co. Isso pareceu funcionar para mim. Embora eu possa estar entendendo mal o seu alvo.
Obrigado pela sua dica! Quero mesclar três geotiffs de banda única em um geotiff de 3 bandas. Meu problema é que a saída de gdal_merge está realmente vazia (pixels = 0). Não posso usar essa saída para nada.
Jorge Arévalo
É possível postar os dados em algum lugar, algo parece errado.
Perguntei ao meu chefe e não posso publicar dados :-(. Na verdade, eu poderia misturar os arquivos com um código independente, que copia banda por banda os arquivos de entrada na saída. Gostaria de fazê-lo com gdal_merge . meu poblem é que não posso definir interpretação das cores RGB para o arquivo de saída com gdal_merge.
Jorge Arévalo
Talvez eu tenha tido um problema semelhante. Consegui trabalhar com rgb2pct.py. Por quê? Não sei. Descrição do comando: Este utilitário calculará uma tabela de pseudo-cores ideal para uma determinada imagem RGB usando um algoritmo de corte médio em um histograma RGB com amostragem reduzida. Então eu corro gdal_translate com expand rgb.

Respostas:

6

gdal_merge.py é a ferramenta correta para 'empilhar' suas imagens de entrada.

Supondo que sua primeira banda tenha uma tabela de cores válida, você poderá usar:

gdal_merge.py -separate -pct -o output_file.tif file1.tif file2.tif file3.tif

Nota: O comando foi reformatado -o output_file.tifantes da lista de entradas.

Dos documentos:

-pct: Pegue uma tabela de pseudo-cor da primeira imagem de entrada e use-a para a saída. A mesclagem de imagens pseudo-coloridas dessa maneira pressupõe que todos os arquivos de entrada usem a mesma tabela de cores.

Eu testaria sua saída gdalinfo -statspara garantir que ela esteja sendo empilhada corretamente.

Atualizado para OP

Na lista osgeo , parece que você pode tentar um formato diferente para verificar os resultados:

Não há como, no formato TIFF, especificar realmente a interpretação das cores de cada banda. A maneira como o GDAL constrói a interpretação das cores ao ler um arquivo TIFF é uma combinação do valor da tag PHOTOMETRIC e EXTRASAMPLES.

-Evan (o pôster) conhece GDAL por dentro e por fora.

Jay Laura
fonte
Na verdade, fiz isso, mas recebo "ERRO 6: SetColorTable () não suportado para arquivos TIFF de várias amostras". E recebo 0 para todos os pixels. Não tenho certeza sobre o significado desse erro.
Jorge Arévalo 15/01
Ok, pergunta atualizada. Eu preciso de uma tabela de cores para a primeira banda.
Jorge Arévalo 15/01
Mmm ... obrigado pela resposta. Estou tentando essas opções. Parece que não posso usar PHOTOMETRIC = rgb porque meu tipo de dados não é int. Mas eu estou nisso ...
Jorge Arévalo
3

A primeira maneira que consigo pensar é criar um vrt, editar e traduzir:

gdalbuildvrt -separate output.vrt file1.tif file2.tif file3.tif

adicione a tag de interp de cores onde for necessário:

...
<VRTRasterBand dataType="Byte" band="1">
<ColorInterp>Red</ColorInterp>
<NoDataValue>255</NoDataValue>
<ComplexSource>
  <SourceFilename relativeToVRT="1">test.tif</SourceFilename>
  <SourceBand>1</SourceBand>
  <SourceProperties RasterXSize="42" RasterYSize="22" DataType="Byte" BlockXSize="42" BlockYSize="22" />
  <SrcRect xOff="0" yOff="0" xSize="42" ySize="22" />
  <DstRect xOff="0" yOff="0" xSize="42" ySize="22" />
  <NODATA>-32768</NODATA>
</ComplexSource>

e depois:

gdal_translate output.vrt output.tif

fonte
Eu tentei, mas meus arquivos raster são rodados ...
Jorge Arévalo
O que significa que eles não têm as mesmas geotransformações / SRS?
Não, todos eles têm as mesmas geotransformações, mas não são rasters do norte (os parâmetros de rotação não são 0). E o gdalbuildvrt não suporta transformações geográficas giradas. Não quero entortá-los.
Jorge Arévalo
Mmmm, ok. Se eu os deformar para criar rasters do norte, posso construir o VRT e adicionar o ColorInterp quando necessário, mas ainda fico cinza, indefinido, indefinido. Preciso criar uma tabela de cores para a primeira banda, mas não sei como. Vou atualizar a pergunta.
Jorge Arévalo 15/01
1

Sua banda de escala de cinza de entrada possui valores de 0 a 1024, mas o RGB permite apenas valores de 0 a 255 para cada banda.

Você pode usar gdal_translate -scale [src_min src_max [dst_min dst_max]]para redimensionar seu arquivo de origem.

Em uma segunda execução, você pode empilhar suas três bandas com gdal_merge.py e aplicar -co "PHOTOMETRIC=rgb".

AndreJ
fonte