Wie füge ich mit GDAL eine Farbinterpretation für Rasterbänder hinzu?

9

Ich habe 3 separate 1-Band-GeoTIFF-Dateien. Die Farbinterpretation für Band ist grau. Ich möchte eine 3-Band-RGB-Datei. Ich habe gdal_merge.py verwendet

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

Die Farbinterpretation für die 3 Bänder der resultierenden output_file.tif ist jedoch grau, undefiniert, undefiniert. Abgesehen davon sind alle Pixel 0 .

Wenn ich pct2rgb.py ausführe, erhalte ich eine RGB-Datei:

pct2rgb.py output_file.tif output_file_rgb.tif

Aber natürlich sind die Pixel auch 0. Ich habe also 3 Fragen:

  • Ist gdal_merge.py das richtige Tool, um 3 1-Band-Dateien in einer 3-Band-RGB-Datei zu kombinieren?
  • Warum bekomme ich eine undefinierte Farbinterpretation für Bands?
  • Ist pct2rgb das richtige Werkzeug, um 3-Band-Dateien mit dieser Farbinterpretation in RGB-Dateien umzuwandeln?

UPDATE : Die Raster haben keine Farbtabelle. Nur Farbinterpretation: Grau.

Andererseits gehen die Pixelwerte von 0 bis 1023 (dies ist absichtlich)

Weitere Daten: Sie sind gedrehte Raster (kein Norden nach oben), aber alle haben die gleiche Geotransform.

UPDATE 2 : Ich kann die Bilder verziehen, um sie nach Norden zu bringen, eine VRT erstellen und ColorInterp für jedes Band hinzufügen, aber ich bekomme immer noch eine Farbinterpretation als grau, undefiniert, undefiniert im Ausgabeergebnis.

Das Problem ist, dass ich zumindest im ersten Band eine Farbtabelle erstellen muss. Ich weiß , wie man sie erstellt , aber ich weiß nicht, wie viele Einträge meine Tabelle haben soll. Warum enthält das Beispiel der GDAL-Raster-FAQ 13 Einträge? Alle Pixel haben Werte zwischen 0 und 1023, wenn dies hilft.

UPDATE 3 : Anscheinend gibt es im TIFF-Format keine Möglichkeit, die Farbinterpretation jedes Bandes wirklich festzulegen. Die Art und Weise, wie GDAL beim Lesen einer TIFF-Datei die Farbinterpretation erstellt, ist eine Kombination aus dem Wert des Tags PHOTOMETRIC und EXTRASAMPLES .

Lesen über diese Tags:

  • PHOTOMETRIC repräsentiert den Farbraum der Bilddaten. Ein Wert von 2 bedeutet, dass die Komponenten eines Pixelwerts RGB sind, aber es werden Byte-Pixel angenommen, und ich habe UInt16-Pixel (ich habe es versucht -co "PHOTOMETRIC=rgb"und habe einen Fehler erhalten). Daher kann ich kein PHOTOMETRIC-Tag für die Ausgabedatei angeben.

  • EXTRASAMPLES gibt an, dass jedes Pixel N zusätzliche Komponenten enthält. Ich bin mir nicht sicher, wie ich dieses Tag zum Erstellen meiner zusammengeführten Datei verwenden soll. Oder wenn ich es brauche.

In Update 2 schlage ich die Erstellung einer Farbtabelle vor, aber wie? In meinen 3 Eingabedateien reichen die Pixelwerte von 0 bis 1023. Muss ich sie mit Farben abgleichen? Muss ich eine ColorTable mit 1024 Eingängen erstellen? Wie?

In Update 3 könnte ich beim Erstellen der zusammengeführten Datei einige GeoTIFF-Tags verwenden, bin mir aber nicht sicher, ob oder wie ich sie wirklich verwenden kann.

Jorge Arévalo
quelle
1
Versuchen Sie Folgendes: Verwenden Sie gdal_merge wie zuvor und dann gdal_translate -co PHOTOMETRIC = RGB, aus welchem ​​Grund auch immer gdal_merge das -co nicht berücksichtigt. Das schien für mich zu funktionieren. Obwohl ich Ihr Ziel möglicherweise falsch verstehe.
Danke für deinen Tipp! Ich möchte 3 Single-Band-Geotiffs in einem 3-Band-Geotiff zusammenführen. Mein Problem ist, dass die Ausgabe von gdal_merge tatsächlich leer ist (Pixel = 0). Ich kann diese Ausgabe für nichts verwenden.
Jorge Arévalo
Ist es möglich, die Daten irgendwo zu posten, scheint etwas nicht zu stimmen.
Ich habe meinen Chef gefragt, und ich kann keine Daten veröffentlichen :-(. Ich könnte die Dateien tatsächlich mit einem eigenständigen Code mischen, der die Eingabedateien in der Ausgabe Band für Band kopiert. Ich würde es gerne mit gdal_merge tun Mein Problem ist, dass ich mit gdal_merge keine RGB-Farbinterpretation für die Ausgabedatei festlegen kann.
Jorge Arévalo
Vielleicht hatte ich ein ähnliches Problem. Habe das mit rgb2pct.py funktioniert. Warum?, Weiß ich nicht. Beschreibung des Befehls: Dieses Dienstprogramm berechnet eine optimale Pseudofarbentabelle für ein bestimmtes RGB-Bild unter Verwendung eines Medianschnittalgorithmus für ein heruntergetastetes RGB-Histogramm. Dann starte ich gdal_translate mit expand rgb.

Antworten:

6

gdal_merge.py ist das richtige Werkzeug, um Ihre Eingabebilder zu "stapeln".

Angenommen, Ihr erstes Band hat eine gültige Farbtabelle, die Sie verwenden könnten:

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

Hinweis: Der Befehl wurde -o output_file.tifvor der Liste der Eingaben neu formatiert .

Aus den Dokumenten:

-pct: Nimm eine Pseudofarbentabelle aus dem ersten Eingabebild und verwende sie für die Ausgabe. Das Zusammenführen von pseudofarbenen Bildern auf diese Weise setzt voraus, dass alle Eingabedateien dieselbe Farbtabelle verwenden.

Ich würde Ihre Ausgabe mit testen gdalinfo -stats, um sicherzustellen, dass sie richtig gestapelt wird.

Aktualisiert für OP

Aus der Osgeo-Liste geht hervor , dass Sie möglicherweise ein anderes Format ausprobieren, um die Ergebnisse zu überprüfen:

Im TIFF-Format gibt es keine Möglichkeit, die Farbinterpretation jedes Bandes wirklich festzulegen. Die Art und Weise, wie GDAL beim Lesen einer TIFF-Datei die Farbinterpretation erstellt, ist eine Kombination aus dem Wert des Tags PHOTOMETRIC und EXTRASAMPLES.

-Evan (das Plakat) kennt GDAL in- und auswendig.

Jay Laura
quelle
Ich habe das tatsächlich getan, aber ich erhalte "FEHLER 6: SetColorTable () wird für TIFF-Dateien mit mehreren Beispielen nicht unterstützt." Und ich bekomme 0 für alle Pixel. Ich bin mir nicht sicher über die Bedeutung dieses Fehlers.
Jorge Arévalo
Ok, aktualisierte Frage. Ich brauche eine Farbtabelle für die erste Band.
Jorge Arévalo
Mmm ... danke für die Antwort. Ich versuche diese Optionen. Scheint, als ob ich PHOTOMETRIC = rgb nicht verwenden kann, weil mein Datentyp nicht int ist. Aber ich bin dabei ...
Jorge Arévalo
3

Der erste Weg, den ich mir vorstellen kann, ist, ein vrt zu erstellen, zu bearbeiten und zu übersetzen:

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

Fügen Sie bei Bedarf das Farb-Interp-Tag hinzu:

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

und dann:

gdal_translate output.vrt output.tif

quelle
Ich habe es versucht, aber meine Rasterdateien werden gedreht ...
Jorge Arévalo
Das heißt, sie haben nicht die gleichen SRS / Geotransformationen?
Nein, sie haben alle die gleichen Geotransformationen, aber sie sind keine Nord-Raster (Rotationsparameter sind nicht 0). Und gdalbuildvrt unterstützt keine gedrehten Geotransformationen. Ich möchte sie nicht verziehen.
Jorge Arévalo
Mh in Ordnung. Wenn ich sie verziehe, um Raster nach Norden zu erstellen, kann ich die VRT erstellen und bei Bedarf ColorInterp hinzufügen. Kaufen, ich werde immer noch grau, undefiniert, undefiniert. Ich muss eine Farbtabelle für die erste Band erstellen, aber ich weiß nicht wie. Ich werde die Frage aktualisieren.
Jorge Arévalo
1

Ihr eingegebenes Graustufenband hat Werte von 0 bis 1024, aber RGB erlaubt nur Werte von 0 bis 255 für jedes Band.

Sie können gdal_translate -scale [src_min src_max [dst_min dst_max]]Ihre Quelldatei neu skalieren.

In einem zweiten Durchgang können Sie Ihre drei Bänder mit gdal_merge.py stapeln und anwenden -co "PHOTOMETRIC=rgb".

AndreJ
quelle