高さマップ用のGeoTiffから16ビットtiff、pngまたはbmp画像


9

Mars Hiriseステレオ画像をISIS3とASPで処理して取得したGeoTiffを持っています。16ビットのグレースケールtiff、pngまたはbmpファイルに変換して、ゲームエンジン、アンリアルエンジン4のハイトマップとして使用したいのですが、gdal_translalteで変換してみました。 16ビットでのみ8ビットで、16ビットではファイルのサイズが大きすぎるというメッセージが表示されます。これは、バイト単位のファイルサイズ、2つのチャネル、イメージサイズに関係しているようです。インポート。次に、gdal_translateを使用して、tiffとpngに変換してみましたが、両方の画像を開いたときに真っ黒です。BelTerGISでGeoTiffを開いてみましたが、それは単なる平面です。私はQGISでGeotiffを開いたところ、情報があり、平らで黒いだけではないことがわかりました。

誰かがgdal、qgis、または何か他の方法でこれを行う方法を知っていますか?私はgdalとqgisの両方を使用するのは非常に新しいので、他の人の例に従っているだけですが、それを実行する方法があるかもしれません。

回答:


6

元の画像の値の範囲に問題がある可能性があります。-scaleパラメータin gdal_translateを使用して、8ビット画像の範囲内の画像を取得できます。

例えば

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

これにより、スケーリングに使用される入力の最小値と最大値が自動的に設定されます。これらが機能しない場合は、後に最小値と最大値を指定できます-scale

画像を小さくする必要がある場合は、gdal_translateを使用してサイズを変更することもできます-outsize。たとえば-outsize 50% 50%、元の50%にサイズ変更されます。


はい、それは範囲で何かのようです、それを私がsagaGISで開くと、最小と最大の両方が約-5600です。私はあなたの例を試しましたが、うまくいきましたが、私が欲しいのは16ビットなので、符号なし16ビットのUInt16を入れてみましたが、画像が白くなってしまいました。16ビットTiffまたはPNGを取得するための正しい入力は何ですか
Stina_F

入力最小最大値と出力最小最大値をscaleパラメータに渡して、16ビット出力を取得できます。最小値と最大値が両方とも-5600である場合、すべてのピクセルが同じ値(-5600)であることを意味するため、scaleパラメーターは役に立ちません。
danclewley

2
完璧に機能してくれてありがとう!私の最小値と最大値は-5660.574と-5618.043なので、そうしました gdal_translate -of PNG -ot Float16 -scale -5660.574 -5618.043 0 65535 input.tif output.png
Stina_F

さて、UInt16は、Float16ではなく上記のコードで私が意味したものでしたが、どちらも機能します。
Stina_F

これに関して別の質問があります。これは値を範囲全体に引き伸ばすのですか、それとも単に上に移動するのですか?私が欲しいのは、それらを上に移動することです。
Stina_F 2016

0

そのために、Pythonスクリプトを使用します。オーバーラップした小さなタイルの大きなGeoTIFF画像を分割できます。高さマップの出力は、シングルランドスケープまたはレベルストリーミング(世界構成)のアンリアルエンジン4で使用する準備ができています。ここで詳細な説明を見つけることができます

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.