GeoTiff auf 16-Bit-TIFF-, PNG- oder BMP-Bild für die Höhenkarte

9

Ich habe einen GeoTiff, der durch die Verarbeitung von Mars Hirise-Stereobildern mit ISIS3 und ASP aufgenommen wurde. Ich möchte es in eine 16-Bit-Graustufen-TIFF-, PNG- oder BMP-Datei konvertieren, um es als Höhenkarte in einer Game-Engine, einer unwirklichen Engine 4, zu verwenden. Ich habe versucht, es mit gdal_translalte zu konvertieren, zuerst in 16-Bit-Draw, aber es stellt sich heraus, dass Photoshop nicht geöffnet werden kann Wenn es nur in 8 Bit in 16 Bit ist, wird die Meldung angezeigt, dass die Größe der Datei in 16 Bit zu groß ist. Dies scheint mit der Dateigröße in Byte, den beiden Kanälen und der Bildgröße zu tun zu haben, die ich versuche importieren. Dann habe ich versucht, es in tiff und png zu konvertieren, auch mit gdal_translate, aber beide Bilder sind nur schwarz, wenn ich sie öffne. Ich habe versucht, mein GeoTiff mit BelnderGIS zu öffnen, aber es ist nur ein flaches Flugzeug. Ich habe den Geotiff in QGIS geöffnet und dann sehe ich, dass er Informationen enthält und nicht nur flach und schwarz ist.

Weiß jemand, wie ich das machen könnte, mit GDAL, QGIS oder etwas anderem? Ich bin sehr neu in der Verwendung von gdal und und qgis. Ich habe nur Beispiele von anderen befolgt, aber es könnte eine Möglichkeit geben, dies zu tun, damit es am Ende für mich funktioniert.

Stina_F
quelle

Antworten:

6

Ich denke, das Problem könnte im Wertebereich Ihres Originalbildes liegen. Mit dem -scaleParameter in können gdal_translateSie Bilder im Bereich eines 8-Bit-Bildes abrufen.

Zum Beispiel

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

Dadurch werden automatisch die für die Skalierung verwendeten minimalen und maximalen Eingabewerte festgelegt. Wenn diese nicht funktionieren, können Sie anschließend einen minimalen und maximalen Wert angeben -scale.

Wenn Sie das Bild verkleinern müssen, können Sie die Größe auch mit gdal_translateverwenden -outsize. Zum Beispiel -outsize 50% 50%wird die Größe auf 50% des Originals geändert.

Danclewley
quelle
Ja, es scheint etwas mit dem Bereich zu sein, wenn ich es in sagaGIS öffne, liegt sowohl min als auch max bei -5600. Ich habe Ihr Beispiel ausprobiert und es hat funktioniert, aber ich möchte 16 Bit, also habe ich versucht, UInt16 für unsigned 16bit einzufügen, aber dann wird das Bild nur weiß. Wissen Sie, was der richtige Eingang wäre, um einen 16bit Tiff oder PNG zu erhalten?
Stina_F
Sie können das Eingangsminimum und das Ausgangsminimum an den Skalierungsparameter übergeben, um eine 16-Bit-Ausgabe zu erhalten. Wenn sowohl das Minimum als auch das Maximum -5600 sind, bedeutet dies, dass alle Pixel den gleichen Wert (-5600) haben, sodass der Skalierungsparameter nicht hilft.
Danclewley
2
Danke, das hat perfekt funktioniert! Meine Min- und Max-Werte sind -5660.574 und -5618.043, also habe ich gdal_translate -of PNG -ot Float16 -scale -5660.574 -5618.043 0 65535 input.tif output.png
Stina_F
Nun, UInt16 war das, was ich im obigen Code anstelle von Float16 gemeint habe, obwohl beide funktionieren.
Stina_F
Ich habe eine andere Frage dazu: Streckt dies die Werte über den gesamten Bereich oder verschiebt es sie nur nach oben? Was ich will, ist, sie einfach nach oben zu bewegen.
Stina_F
0

Zu diesem Zweck verwende ich Python-Skript. Es kann große GeoTIFF-Bilder für kleinere Kacheln mit Überlappung teilen. Die Ausgabe der Höhenkarte kann in der unwirklichen Engine 4 in einzelnen Landschafts- oder Ebenen-Streams (Weltkomposition) verwendet werden. Hier finden Sie eine ausführliche Erklärung

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
quelle