Comment ajouter une interprétation des couleurs pour les bandes raster à l'aide de GDAL?

9

J'ai 3 fichiers GeoTIFF 1 bande distincts. L'interprétation des couleurs pour la bande est grise. Je veux un fichier RVB 3 bandes. J'ai utilisé gdal_merge.py

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

Mais l'interprétation des couleurs pour les 3 bandes du fichier output_file.tif résultant est grise, indéfinie, indéfinie. En dehors de cela, tous les pixels sont à 0 .

Si j'exécute pct2rgb.py, j'obtiens un fichier RGB:

pct2rgb.py output_file.tif output_file_rgb.tif

Mais bien sûr, les pixels sont également à 0. Donc, j'ai 3 questions:

  • Gdal_merge.py est-il le bon outil pour combiner 3 fichiers 1 bande en un seul fichier RVB 3 bandes?
  • Pourquoi ai-je une interprétation des couleurs indéfinie pour les bandes?
  • Pct2rgb est-il le bon outil pour transformer des fichiers 3 bandes avec cette interprétation des couleurs en fichiers RVB?

MISE À JOUR : Les rasters n'ont pas de table de couleurs. Juste interprétation des couleurs: gris.

D'autre part, les valeurs des pixels vont de 0 à 1023 (c'est délibéré)

Plus de données: ce sont des rasters en rotation (pas vers le nord), mais tous ont la même géotransformation.

MISE À JOUR 2 : Je peux déformer les images pour les faire remonter vers le nord, construire un VRT et ajouter ColorInterp pour chaque bande, mais j'obtiens toujours une interprétation des couleurs comme grise, indéfinie, indéfinie dans le résultat de sortie.

Le problème est que je dois créer une table des couleurs dans, au moins, la première bande. Je sais comment les créer , mais je ne sais pas combien d'entrées ma table doit contenir. Pourquoi y a-t-il 13 entrées dans l'exemple de FAQ GDAL Raster? Tous les pixels ont des valeurs comprises entre 0 et 1023, si cela aide.

MISE À JOUR 3 : Apparemment, il n'y a aucun moyen dans le format TIFF de vraiment spécifier l'interprétation des couleurs de chaque bande. La façon dont GDAL construit l'interprétation des couleurs lors de la lecture d'un fichier TIFF est une combinaison de la valeur des balises PHOTOMETRIC et EXTRASAMPLES .

Lire sur ces balises:

  • PHOTOMÉTRIQUE représente l'espace colorimétrique des données d'image. Une valeur de 2 signifie que les composants d'une valeur de pixel sont RVB, mais cela suppose des pixels d'octet et j'ai des pixels UInt16 (j'ai essayé -co "PHOTOMETRIC=rgb"et obtenu une erreur). Donc, je ne peux pas spécifier de balise PHOTOMETRIC pour le fichier de sortie.

  • EXTRASAMPLES spécifie que chaque pixel a N composants supplémentaires. Je ne sais pas comment utiliser cette balise pour créer mon fichier fusionné. Ou si j'en ai besoin.

Donc, dans la mise à jour 2, je suggère la création d'un ColorTable, mais comment? Dans mes 3 fichiers d'entrée, les valeurs des pixels vont de 0 à 1023. Dois-je les faire correspondre avec des couleurs? Dois-je créer un ColorTable avec 1024 entrées? Comment?

Dans la mise à jour 3, il semble que je pourrais utiliser certaines balises GeoTIFF lors de la création du fichier fusionné, mais je ne sais pas si je peux vraiment les utiliser, ni comment.

Jorge Arévalo
la source
1
Essayez ceci: Utilisez gdal_merge comme vous l'avez fait, puis gdal_translate -co PHOTOMETRIC = RGB, pour une raison quelconque, gdal_merge n'honore pas le -co. Cela a semblé fonctionner pour moi. Bien que je puisse mal comprendre votre cible.
Merci pour votre conseil! Je veux fusionner 3 géotiffes à bande unique en un géotiff à 3 bandes. Mon problème est que la sortie de gdal_merge est en fait vide (pixels = 0). Je ne peux utiliser cette sortie pour rien.
Jorge Arévalo
Est-il possible de publier les données quelque part, quelque chose semble mal.
J'ai demandé à mon patron, et je ne peux pas publier de données :-(. En fait, je pourrais mélanger les fichiers avec un code autonome, qui copie bande par bande les fichiers d'entrée dans la sortie. J'aimerais le faire avec gdal_merge Mon problème est que je ne peux pas définir l'interprétation des couleurs RVB pour le fichier de sortie avec gdal_merge.
Jorge Arévalo
Peut-être, j'ai eu un problème similaire. Vous avez cela avec rgb2pct.py. Pourquoi?, Je ne sais pas. Description de la commande: cet utilitaire calcule une table de pseudo-couleurs optimale pour une image RVB donnée en utilisant un algorithme de coupe médiane sur un histogramme RVB sous-échantillonné. Ensuite, je lance gdal_translate avec expand rgb.

Réponses:

6

gdal_merge.py est l'outil approprié pour «empiler» vos images d'entrée.

En supposant que votre premier groupe possède une table de couleurs valide, vous pouvez utiliser:

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

Remarque: La commande a été reformatée avec -o output_file.tifavant la liste des entrées.

De la documentation:

-pct: Prenez une table pseudocolor de la première image d'entrée et utilisez-la pour la sortie. La fusion d'images pseudocolorées de cette façon suppose que tous les fichiers d'entrée utilisent la même table de couleurs.

Je testerais votre sortie avec gdalinfo -statspour m'assurer qu'elle est correctement empilée.

Mis à jour pour OP

Dans la liste osgeo , il semble que vous puissiez essayer un autre format pour vérifier les résultats:

Il n'y a aucun moyen dans le format TIFF de vraiment spécifier l'interprétation des couleurs de chaque bande. La manière dont GDAL construit l'interprétation des couleurs lors de la lecture d'un fichier TIFF est une combinaison de la valeur des balises PHOTOMETRIC et EXTRASAMPLES.

-Evan (l'affiche) connaît GDAL à l'intérieur comme à l'extérieur.

Jay Laura
la source
C'est ce que j'ai fait, mais j'obtiens "ERREUR 6: SetColorTable () non pris en charge pour les fichiers TIFF à plusieurs échantillons". Et j'obtiens 0 pour tous les pixels. Je ne suis pas sûr de la signification de cette erreur.
Jorge Arévalo
Ok, question mise à jour. J'ai besoin d'une table de couleurs pour le premier groupe.
Jorge Arévalo
Mmm ... merci pour la réponse. J'essaie ces options. Il semble que je ne puisse pas utiliser PHOTOMETRIC = rgb car mon type de données n'est pas int. Mais j'y suis ...
Jorge Arévalo
3

La première façon dont je peux penser est de construire un vrt, d'éditer et de traduire:

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

ajoutez la balise interp couleur si nécessaire:

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

et alors:

gdal_translate output.vrt output.tif

la source
J'ai essayé, mais mes fichiers raster sont tournés ...
Jorge Arévalo
Cela signifie qu'ils n'ont pas les mêmes SRS / géotransformations?
Non, ils ont tous les mêmes géotransformations, mais ce ne sont pas des rasters nord-haut (les paramètres de rotation ne sont pas 0). Et gdalbuildvrt ne prend pas en charge les transformations géographiques tournées. Je ne veux pas les déformer.
Jorge Arévalo
Mmmm, ok. Si je les déforme pour créer des rasters vers le nord, je peux créer le VRT et ajouter ColorInterp si nécessaire, acheter, je reçois toujours du gris, indéfini, indéfini. J'ai besoin de créer une table des couleurs pour le premier groupe, mais je ne sais pas comment. Je mettrai à jour la question.
Jorge Arévalo
1

Votre bande d'entrée en niveaux de gris a des valeurs de 0 à 1024, mais RVB n'autorise que des valeurs de 0 à 255 pour chaque bande.

Vous pouvez utiliser gdal_translate -scale [src_min src_max [dst_min dst_max]]pour redimensionner votre fichier source.

Dans un deuxième temps, vous pouvez empiler vos trois bandes avec gdal_merge.py et appliquer -co "PHOTOMETRIC=rgb".

AndreJ
la source