GeoTiff a imagen de tiff, png o bmp de 16 bits para el mapa de altura

9

Tengo un GeoTiff que adquirió a través del procesamiento de imágenes estéreo de Mars Hirise con ISIS3 y ASP. Quiero convertirlo a un archivo tiff, png o bmp en escala de grises de 16 bits para usarlo como mapa de altura en un motor de juego, motor irreal 4. Intenté convertirlo con gdal_translalte, primero a 16 bits .raw pero resulta que Photoshop no se puede abrir en 16 bits solo en 8 bits, recibo un mensaje que dice que el tamaño es demasiado grande para el archivo en 16 bits, algo que parece tener que ver con el tamaño del archivo en bytes, los dos canales y el tamaño de la imagen que intento importar. Luego intenté convertirlo a tiff y png, también con gdal_translate, pero ambas imágenes son negras cuando las abro. Intenté abrir mi GeoTiff con BelnderGIS pero es solo un avión plano. Abrí el Geotiff en QGIS y luego veo que tiene información y que no es solo plano y negro.

¿Alguien sabe cómo podría hacer esto, con gdal, qgis u otra cosa? Soy muy nuevo en el uso de gdal y qgis, acabo de seguir ejemplos de otros, pero podría haber una manera de hacerlo, así que al final me funciona.

Stina_F
fuente

Respuestas:

6

Creo que el problema podría estar con el rango de valores en su imagen original. Puede usar el -scaleparámetro gdal_translatepara obtener imágenes dentro del rango de una imagen de 8 bits.

Por ejemplo

gdal_translate -of PNG -ot Byte -scale in_tiff.tif out_png_scaled.png

Esto establecerá automáticamente los valores mínimos y máximos de entrada utilizados para escalar, si estos no funcionan, puede especificar un valor mínimo y máximo después -scale.

Si necesita hacer la imagen más pequeña, también puede cambiar el tamaño con el gdal_translateuso -outsize. Por ejemplo, -outsize 50% 50%cambiará de tamaño al 50% del original.

danclewley
fuente
Sí, parece ser algo con el rango, cuando lo abro en sagaGIS, tanto min como max son alrededor de -5600. Probé su ejemplo y funcionó, pero lo que quiero es 16 bits, así que traté de poner UInt16 para Unsigned 16bit pero luego la imagen sale blanca, ¿sabe cuál sería la entrada correcta para obtener un Tiff de 16 bits o PNG?
Stina_F
Puede pasar el mínimo de entrada máximo y el mínimo de salida máximo al parámetro de escala para obtener una salida de 16 bits. Si el mínimo y el máximo son ambos -5600, eso significaría que todos los píxeles tienen el mismo valor (-5600), por lo que el parámetro de escala no ayudará.
danclewley
2
¡Gracias que funcionó perfectamente! Mis valores mínimos y máximos son -5660.574 y -5618.043, así que lo hice gdal_translate -of PNG -ot Float16 -scale -5660.574 -5618.043 0 65535 input.tif output.png
Stina_F
Bueno, UInt16 fue lo que quise decir en el código anterior en lugar de Float16, aunque ambos funcionan.
Stina_F
Tengo otra pregunta con respecto a esto, ¿esto estira los valores en todo el rango o simplemente los mueve hacia arriba? Lo que quiero es simplemente moverlos hacia arriba.
Stina_F
0

Para ello utilizo el script Python. Puede dividir una imagen GeoTIFF grande para mosaicos más pequeños con superposición. El mapa de altura de salida está listo para usar en el motor 4 irreal en un solo paisaje o transmisión de niveles (composición mundial). Aquí puedes encontrar una explicación detallada

import os
import gdal
import subprocess

source_path = 'C:/Users/unreal4/Downloads/AP_08049_FBD_F0980_RT1/heightmap.tif'
tiles_folder = 'C:/Users/unreal4/Downloads/AP_08049_FBD_F0980_RT1/tiles/'

tile_size_x = 2017
tile_size_y = 2017

tile_prefix = "tile"
tile_x = 0
tile_y = 0

ds = gdal.Open(source_path)
band = ds.GetRasterBand(1)
xsize = band.XSize - 1
ysize = band.YSize - 1

min_height = 384.5
max_height = 1105.8

for i in range(0, xsize, tile_size_x - 1):
    for j in range(0, ysize, tile_size_y - 1):
        format = "-ot UInt16 -of PNG -scale " + str(min_height) +  " " + str(max_height) + " 0 65535"
        cutting_frame = "-srcwin " + str(i) + " " + str(j) + " " + str(tile_size_x) + " " + str(tile_size_y)
        output_path = tiles_folder + tile_prefix + "_x" + str(tile_x) + "_y" + str(tile_y) + ".png"
        full_command = "gdal_translate " + format + " " + cutting_frame + " " + source_path + " " + output_path
        os.system(full_command)
        # version with subprocess module
        # args = ['gdal_translate', '-ot', 'UInt16', '-of', 'PNG', '-scale', str(min_height), str(max_height), '0', '65535', '-srcwin', str(i), str(j), str(tile_size_x), str(tile_size_y), source_path , output_path]
        # subprocess.check_call(args)
        tile_y = tile_y + 1
    tile_x = tile_x + 1
    tile_y = 0
tkuczynski
fuente