GeoTiff à 16 bits tiff, image png ou bmp pour heightmap

9

J'ai un GeoTiff qui a acquis par le traitement d'images stéréo Mars Hirise avec ISIS3 et ASP. Je veux le convertir en fichier tiff, png ou bmp en niveaux de gris 16 bits à utiliser comme carte de hauteur dans un moteur de jeu, moteur irréel 4. J'ai essayé de le convertir avec gdal_translalte, d'abord en 16 bits .raw mais il s'avère que Photoshop ne peut pas s'ouvrir en 16 bits uniquement en 8 bits, je reçois un message disant que la taille est trop grande pour le fichier en 16 bits, quelque chose qui semble avoir à voir avec la taille du fichier en octets, les deux canaux et la taille de l'image que j'essaie de importation. Ensuite, j'ai essayé de le convertir en tiff et png, également avec gdal_translate mais les deux images sont juste noires lorsque je les ouvre. J'ai essayé d'ouvrir mon GeoTiff avec BelnderGIS mais ce n'est qu'un plan plat. J'ai ouvert le Geotiff dans QGIS, puis je vois qu'il contient des informations et n'est pas seulement plat et noir.

Est-ce que quelqu'un sait comment je pourrais faire cela, avec gdal, qgis ou autre chose? Je suis très nouveau dans l'utilisation de gdal et de qgis, je viens de suivre des exemples des autres, mais il pourrait y avoir un moyen de le faire, donc cela fonctionne pour moi à la fin.

Stina_F
la source

Réponses:

6

Je pense que le problème pourrait être avec la plage de valeurs dans votre image d'origine. Vous pouvez utiliser le -scaleparamètre in gdal_translatepour obtenir des images dans la plage d'une image 8 bits.

Par exemple

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

Cela définira automatiquement les valeurs minimales et maximales d'entrée utilisées pour l'échelle, si celles-ci ne fonctionnent pas, vous pouvez spécifier une valeur minimale et maximale après -scale.

Si vous devez réduire l'image, vous pouvez également la redimensionner à l' gdal_translateaide de -outsize. Par exemple, -outsize 50% 50%redimensionnera à 50% de l'original.

Danclewley
la source
Oui, cela semble être quelque chose avec la plage, lorsque je l'ouvre dans sagaGIS, le min et le max sont autour de -5600. J'ai essayé votre exemple et cela a fonctionné, mais ce que je veux, c'est 16 bits, j'ai donc essayé de mettre UInt16 pour Unsigned 16bit, mais l'image sort juste en blanc, savez-vous quelle serait la bonne entrée pour obtenir un Tiff ou PNG 16 bits?
Stina_F
Vous pouvez transmettre le maximum minimum d'entrée et le maximum minimum de sortie au paramètre d'échelle pour obtenir une sortie 16 bits. Si le minimum et le maximum sont tous les deux -5600, cela signifierait que tous les pixels ont la même valeur (-5600), donc le paramètre d'échelle n'aidera pas.
danclewley
2
Merci qui a parfaitement fonctionné! Mes valeurs min et max sont -5660.574 et -5618.043 donc je l'ai fait gdal_translate -of PNG -ot Float16 -scale -5660.574 -5618.043 0 65535 input.tif output.png
Stina_F
Eh bien, UInt16 était ce que je voulais dire dans le code ci-dessus au lieu de Float16, bien que les deux fonctionnent.
Stina_F
J'ai une autre question à ce sujet, cela étire-t-il les valeurs sur toute la plage ou les fait-il simplement monter? Ce que je veux, c'est simplement les déplacer vers le haut.
Stina_F
0

Pour cela, j'utilise un script Python. Il peut diviser une grande image GeoTIFF pour des tuiles plus petites avec chevauchement. La carte de hauteur de sortie est prête à être utilisée dans le moteur irréel 4 en paysage unique ou en streaming de niveaux (composition mondiale). Ici vous pouvez trouver une explication détaillée

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
la source