Gambar GeoTiff hingga 16 bit tiff, png atau bmp untuk heightmap

9

Saya memiliki GeoTiff yang diperoleh melalui pemrosesan gambar stereo Mars Hirise dengan ISIS3 dan ASP. Saya ingin mengonversinya menjadi file tiff, png, atau bmp skala abu-abu 16bit untuk digunakan sebagai heightmap dalam mesin gim, mesin tidak nyata 4. Saya mencoba mengonversinya dengan gdal_translalte, pertama ke 16 bit. dalam 16 bit hanya dalam 8bit, saya mendapatkan pesan yang mengatakan bahwa ukurannya besar untuk file dalam 16 bit, sesuatu yang tampaknya ada hubungannya dengan ukuran file dalam byte, dua saluran dan ukuran gambar yang saya coba untuk impor. Kemudian saya mencoba mengubahnya menjadi tiff dan png, juga dengan gdal_translate tetapi kedua gambar itu hanya hitam ketika saya membukanya. Saya mencoba membuka GeoTiff saya dengan BelnderGIS tetapi itu hanya bidang datar. Saya membuka Geotiff di QGIS dan kemudian saya melihat Geotiff memiliki informasi dan bukan hanya datar dan hitam.

Adakah yang tahu bagaimana saya bisa melakukan ini, dengan gdal, qgis atau yang lainnya? Saya sangat baru menggunakan kedua gdal dan dan qgis, saya hanya mengikuti contoh dari orang lain tetapi mungkin ada cara untuk melakukannya sehingga itu bekerja untuk saya pada akhirnya.

Stina_F
sumber

Jawaban:

6

Saya pikir masalahnya bisa dengan kisaran nilai di gambar asli Anda. Anda dapat menggunakan -scaleparameter gdal_translateuntuk mendapatkan gambar dalam kisaran gambar 8 bit.

Sebagai contoh

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

Ini akan secara otomatis menetapkan nilai minimum dan maksimum input yang digunakan untuk menskala, jika ini tidak berhasil, Anda dapat menentukan nilai minimum dan maksimum setelahnya -scale.

Jika Anda perlu membuat gambar lebih kecil Anda juga dapat mengubah ukuran dengan gdal_translatemenggunakan -outsize. Misalnya, -outsize 50% 50%akan mengubah ukuran hingga 50% dari aslinya.

danclewley
sumber
Ya sepertinya ada sesuatu dengan jangkauan, ketika saya membukanya di sagaGIS baik min dan max sekitar -5600. Saya mencoba contoh Anda dan itu berhasil tetapi yang saya inginkan adalah 16 bit jadi saya mencoba memasukkan UInt16 untuk Unsigned 16bit tetapi kemudian gambarnya keluar putih, apakah Anda tahu input yang tepat untuk mendapatkan Tiff 16bit atau PNG?
Stina_F
Anda dapat memasukkan input minimum maksimum dan output minimum maksimum ke parameter skala untuk mendapatkan output 16 bit. Jika minimum dan maksimum keduanya -5600 itu berarti semua piksel memiliki nilai yang sama (-5600) sehingga parameter skala tidak akan membantu.
danclewley
2
Terima kasih, itu berhasil dengan sempurna! Nilai min dan maks saya adalah -5660.574 dan -5618.043 jadi saya lakukan gdal_translate -of PNG -ot Float16 -scale -5660.574 -5618.043 0 65535 input.tif output.png
Stina_F
Nah, UInt16 adalah apa yang saya maksudkan dalam kode di atas bukannya Float16 meskipun keduanya berfungsi.
Stina_F
Saya punya pertanyaan lain tentang ini, apakah ini meregangkan nilai-nilai pada seluruh jajaran atau apakah hanya menaikkannya? Yang saya inginkan adalah naikkan mereka.
Stina_F
0

Untuk tujuan itu saya menggunakan skrip Python. Ini dapat membagi gambar GeoTIFF besar untuk ubin yang lebih kecil dengan tumpang tindih. Peta tinggi keluaran siap digunakan di engine nyata dalam lanskap tunggal atau level streaming (komposisi dunia). Di sini Anda dapat menemukan penjelasan terperinci

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
sumber