¿Cómo agregar interpretación de color para bandas de trama usando GDAL?

9

Tengo 3 archivos GeoTIFF de 1 banda separados. La interpretación del color para la banda es gris. Quiero un archivo RGB de 3 bandas. He usado gdal_merge.py

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

Pero la interpretación del color para las 3 bandas del archivo resultante output_tif es gris, indefinido, indefinido. Aparte de eso, todos los píxeles son 0 .

Si ejecuto pct2rgb.py, obtengo un archivo RGB:

pct2rgb.py output_file.tif output_file_rgb.tif

Pero, por supuesto, los píxeles también son 0. Entonces, tengo 3 preguntas:

  • ¿Es gdal_merge.py la herramienta adecuada para combinar 3 archivos de 1 banda en un archivo RGB de 3 bandas?
  • ¿Por qué obtengo una interpretación de color indefinida para las bandas?
  • ¿Es pct2rgb la herramienta adecuada para transformar archivos de 3 bandas con esta interpretación de color en archivos RGB?

ACTUALIZACIÓN : Los rásteres no tienen una tabla de colores. Solo interpretación del color: gris.

Por otro lado, los valores de píxeles van de 0 a 1023 (esto es deliberado)

Más datos: son rásteres rotados (sin norte hacia arriba), pero todos tienen la misma geotransformación.

ACTUALIZACIÓN 2 : puedo deformar las imágenes para hacerlas hacia el norte, construir un VRT y agregar ColorInterp para cada banda, pero aún obtengo la interpretación del color como gris, indefinido, indefinido en el resultado de salida.

El problema es que necesito crear una tabla de colores en, al menos, la primera banda. Sé cómo crearlos , pero no sé cuántas entradas debe tener mi tabla. ¿Por qué hay 13 entradas en el ejemplo de preguntas frecuentes de Raster de GDAL? Todos los píxeles tienen valores entre 0 y 1023, si ayuda.

ACTUALIZACIÓN 3 : Aparentemente, no hay forma en el formato TIFF de especificar realmente la interpretación del color de cada banda. La forma en que GDAL crea la interpretación del color al leer un archivo TIFF es una combinación del valor de la etiqueta PHOTOMETRIC y EXTRASAMPLES .

Lectura sobre estas etiquetas:

  • PHOTOMETRIC representa el espacio de color de los datos de la imagen. Un valor de 2 significa que los componentes de un valor de píxel son RGB, pero asume Byte píxeles, y tengo UInt16 píxeles (lo intenté -co "PHOTOMETRIC=rgb"y obtuve un error). Por lo tanto, no puedo especificar la etiqueta PHOTOMETRIC para el archivo de salida.

  • EXTRASAMPLES especifica que cada píxel tiene N componentes adicionales. No estoy seguro de cómo usar esta etiqueta para crear mi archivo combinado. O si lo necesito.

Entonces, en la actualización 2 sugiero la creación de una ColorTable, pero ¿cómo? En mis 3 archivos de entrada, los valores de píxeles van de 0 a 1023. ¿Tengo que hacerlos coincidir con los colores? ¿Tengo que crear una ColorTable con 1024 entradas? ¿Cómo?

En la actualización 3, parece que podría usar algunas etiquetas GeoTIFF al crear el archivo combinado, pero no estoy seguro de si realmente puedo usarlas, o cómo.

Jorge Arévalo
fuente
1
Intente esto: use gdal_merge como lo hizo, luego gdal_translate -co PHOTOMETRIC = RGB, por cualquier razón gdal_merge no respeta el -co. Esto pareció funcionar para mí. Aunque puedo estar malentendiendo tu objetivo.
Gracias por tu consejo! Quiero fusionar 3 geotiffs de banda única en un geotiff de 3 bandas. Mi problema es que la salida de gdal_merge está realmente vacía (píxeles = 0). No puedo usar esa salida para nada.
Jorge Arévalo
¿Es posible publicar los datos en alguna parte, algo parece estar mal?
Le pregunté a mi jefe, y no puedo publicar datos :-(. De hecho, podría mezclar los archivos con un código independiente, que copia banda por banda los archivos de entrada en la salida. Me gustaría hacerlo con gdal_merge Mi problema es que no puedo configurar la interpretación de color RGB para el archivo de salida con gdal_merge.
Jorge Arévalo
Quizás tuve un problema similar. Tengo esto trabajando con rgb2pct.py. ¿Por qué ?, no sé. Descripción del comando: Esta utilidad calculará una tabla de pseudocolor óptima para una imagen RGB dada usando un algoritmo de corte medio en un histograma RGB de muestreo inferior. Luego ejecuto gdal_translate con expandir rgb.

Respuestas:

6

gdal_merge.py es la herramienta correcta para 'apilar' sus imágenes de entrada.

Suponiendo que su primera banda tiene una tabla de colores válida, puede usar:

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

Nota: El comando se ha formateado -o output_file.tifantes de la lista de entradas.

De los documentos:

-pct: toma una tabla de pseudocolor de la primera imagen de entrada y úsala para la salida. Fusionar imágenes pseudocoloradas de esta manera supone que todos los archivos de entrada usan la misma tabla de colores.

Probaría su salida gdalinfo -statspara asegurarme de que se apila correctamente.

Actualizado para OP

De la lista de osgeo , parece que podría probar un formato diferente para verificar los resultados:

No hay forma en el formato TIFF de especificar realmente la interpretación del color de cada banda. La forma en que GDAL crea la interpretación del color al leer un archivo TIFF es una combinación del valor de la etiqueta PHOTOMETRIC y EXTRASAMPLES.

-Evan (el afiche) conoce a GDAL por dentro y por fuera.

Jay Laura
fuente
Realmente hice eso, pero aparece "ERROR 6: SetColorTable () no compatible con archivos TIFF de muestras múltiples". Y obtengo 0 para todos los píxeles. No estoy seguro del significado de este error.
Jorge Arévalo
Ok, pregunta actualizada. Necesito una tabla de colores para la primera banda.
Jorge Arévalo
Mmm ... gracias por la respuesta. Estoy probando esas opciones. Parece que no puedo usar PHOTOMETRIC = rgb porque mi tipo de datos no es int. Pero estoy en ello ...
Jorge Arévalo
3

La primera forma en que puedo pensar es construir un vrt, editar y traducir:

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

agregue la etiqueta de color interp donde sea necesario:

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

y entonces:

gdal_translate output.vrt output.tif

fuente
Lo intenté, pero mis archivos de trama están rotados ...
Jorge Arévalo
¿Significa que no tienen los mismos SRS / geotransforms?
No, todos tienen las mismas geotransformaciones, pero no son rásteres de norte a norte (los parámetros de rotación no son 0). Y gdalbuildvrt no admite transformaciones geográficas rotadas. No quiero deformarlos.
Jorge Arévalo
Mmmm, de acuerdo. Si los combino para crear rásteres hacia el norte, puedo construir el VRT y agregar ColorInterp donde sea necesario, aunque sigo obteniendo gris, indefinido, indefinido. Necesito crear una tabla de colores para la primera banda, pero no sé cómo. Actualizaré la pregunta.
Jorge Arévalo
1

Su banda de escala de grises de entrada tiene valores de 0 a 1024, pero RGB solo permite valores de 0 a 255 para cada banda.

Puede usar gdal_translate -scale [src_min src_max [dst_min dst_max]]para reescalar su archivo fuente.

En una segunda ejecución, puede apilar sus tres bandas con gdal_merge.py y aplicar -co "PHOTOMETRIC=rgb".

AndreJ
fuente