Come aggiungere l'interpretazione del colore per le bande raster usando GDAL?


9

Ho 3 file GeoTIFF separati a 1 banda. L'interpretazione del colore per la banda è grigia. Voglio un file RGB a 3 bande. Ho usato gdal_merge.py

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

Ma l'interpretazione del colore per le 3 bande dell'output_file.tif risultante è grigia, indefinita, indefinita. A parte questo, tutti i pixel sono 0 .

Se eseguo pct2rgb.py, ottengo un file RGB:

pct2rgb.py output_file.tif output_file_rgb.tif

Ma ovviamente anche i pixel sono 0. Quindi, ho 3 domande:

  • Gdal_merge.py è lo strumento giusto per combinare 3 file a 1 banda in un file RGB a 3 bande?
  • Perché ricevo un'interpretazione cromatica indefinita per le bande?
  • Pct2rgb è lo strumento giusto per trasformare i file a 3 bande con questa interpretazione dei colori in file RGB?

AGGIORNAMENTO : i raster non hanno una tabella di colori. Solo interpretazione del colore: grigio.

D'altra parte, i valori dei pixel vanno da 0 a 1023 (questo è intenzionale)

Più dati: sono raster ruotati (no verso nord), ma tutti hanno la stessa geotrasformazione.

AGGIORNAMENTO 2 : Posso deformare le immagini per renderle a nord, costruire un VRT e aggiungere ColorInterp per ogni banda, ma ottengo ancora l'interpretazione del colore come grigio, indefinito, indefinito nel risultato di output.

Il problema è che devo creare una tabella di colori, almeno nella prima banda. Conosco il modo di crearli , ma non so quante voci dovrebbe avere la mia tabella. Perché ci sono 13 voci nell'esempio delle domande frequenti su GDAL Raster? Tutti i pixel hanno valori compresi tra 0 e 1023, se aiutano.

AGGIORNAMENTO 3 : Apparentemente, nel formato TIFF non c'è modo di specificare veramente l'interpretazione del colore di ogni banda. Il modo in cui GDAL crea l'interpretazione del colore durante la lettura di un file TIFF è una combinazione del valore del tag PHOTOMETRIC ed EXTRASAMPLES .

Leggendo su questi tag:

  • PHOTOMETRIC rappresenta lo spazio colore dei dati dell'immagine. Un valore di 2 significa che i componenti di un valore di pixel sono RGB, ma assume pixel Byte e ho UInt16 pixel (ho provato -co "PHOTOMETRIC=rgb"e ho ricevuto un errore). Quindi, non posso specificare il tag PHOTOMETRIC per il file di output.

  • EXTRASAMPLES specifica che ogni pixel ha N componenti aggiuntivi. Non sono sicuro di come utilizzare questo tag per creare il mio file unito. O se ne ho bisogno.

Quindi, nell'aggiornamento 2 suggerisco la creazione di una ColorTable, ma come? Nei miei 3 file di input, i valori dei pixel vanno da 0 a 1023. Devo abbinarli ai colori? Devo creare una ColorTable con 1024 input? Come?

Nell'aggiornamento 3, sembra che potrei usare alcuni tag GeoTIFF durante la creazione del file unito, ma non sono sicuro di poterli usare davvero, o come.


1
Prova questo: usa gdal_merge come hai fatto tu, quindi gdal_translate -co PHOTOMETRIC = RGB, per qualunque motivo gdal_merge non rispetta il -co. Questo sembra funzionare per me. Anche se potrei fraintendere il tuo obiettivo.

Grazie per il tuo consiglio! Voglio unire 3 geotiff a banda singola in un geotiff a 3 bande. Il mio problema è che l'output di gdal_merge è effettivamente vuoto (pixel = 0). Non posso usare quell'output per niente.
Jorge Arévalo,

È possibile pubblicare i dati da qualche parte, qualcosa sembra non funzionare.

Ho chiesto al mio capo e non posso pubblicare dati :-(. In realtà potrei mescolare i file con un codice autonomo, che copia banda per banda i file di input nell'output. Vorrei farlo con gdal_merge Il mio problema è che non riesco a impostare l'interpretazione del colore RGB per il file di output con gdal_merge
Jorge Arévalo,

Forse ho avuto un problema simile. Ha funzionato con rgb2pct.py. Perché ?, non lo so. Descrizione del comando: questa utility calcolerà una tabella pseudo-colori ottimale per una determinata immagine RGB usando un algoritmo di taglio mediano su un istogramma RGB sottocampionato. Quindi eseguo gdal_translate con espandi rgb.

Risposte:


6

gdal_merge.py è lo strumento corretto per "impilare" le immagini di input.

Supponendo che la tua prima banda abbia una tabella di colori valida puoi usare:

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

Nota: il comando è stato riformattato con -o output_file.tifprima dell'elenco degli input.

Dai documenti:

-pct: prende una tabella pseudocolor dalla prima immagine di input e la usa per l'output. La fusione di immagini pseudocolorizzate in questo modo presuppone che tutti i file di input utilizzino la stessa tabella di colori.

Vorrei testare il tuo output con gdalinfo -statsper assicurarmi che sia impilato correttamente.

Aggiornato per OP

Dall'elenco osgeo , sembra che potresti provare un formato diverso per verificare i risultati:

Non c'è modo nel formato TIFF di specificare veramente l'interpretazione del colore di ogni banda. Il modo in cui GDAL crea l'interpretazione del colore durante la lettura di un file TIFF è una combinazione del valore del tag PHOTOMETRIC ed EXTRASAMPLES.

-Evan (il poster) conosce GDAL dentro e fuori.


In realtà l'ho fatto, ma ottengo "ERRORE 6: SetColorTable () non supportato per file TIFF multi-campione.". E ottengo 0 per tutti i pixel. Non sono sicuro del significato di questo errore.
Jorge Arévalo,

Ok, domanda aggiornata. Ho bisogno di una tabella di colori per la prima banda.
Jorge Arévalo,

Mmm ... grazie per la risposta. Sto provando quelle opzioni. Sembra che non riesca a usare PHOTOMETRIC = rgb perché il mio tipo di dati non è int. Ma ci sono ...
Jorge Arévalo,

3

Il primo modo in cui riesco a pensare è costruire un vrt, modificare e tradurre:

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

aggiungere il tag interp colore dove necessario:

...
<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 poi:

gdal_translate output.vrt output.tif

Ci ho provato, ma i miei file raster sono ruotati ...
Jorge Arévalo,

Significa che non hanno gli stessi SRS / geotrasformi?

No, hanno tutti le stesse geotrasforme, ma non sono raster a nord (i parametri di rotazione non sono 0). E gdalbuildvrt non supporta le trasformazioni geografiche ruotate. Non voglio deformarli.
Jorge Arévalo,

Mmmm, ok. Se li ordino per creare raster nord, posso costruire il VRT e aggiungere ColorInterp dove necessario, comprare ottengo ancora grigio, indefinito, indefinito. Devo creare una tabella di colori per la prima banda, ma non so come. Aggiornerò la domanda.
Jorge Arévalo,

1

La banda in scala di grigi di input ha valori compresi tra 0 e 1024, ma RGB consente solo valori compresi tra 0 e 255 per ciascuna banda.

È possibile utilizzare gdal_translate -scale [src_min src_max [dst_min dst_max]]per ridimensionare il file di origine.

In una seconda corsa, puoi impilare le tue tre bande con gdal_merge.py e applicare -co "PHOTOMETRIC=rgb".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.