GeoTiff đến hình ảnh tiff, png hoặc bmp 16 bit cho chiều cao


9

Tôi có một GeoTiff có được thông qua xử lý hình ảnh âm thanh nổi Mars Hirise với ISIS3 và ASP. Tôi muốn chuyển đổi nó thành tệp greyscale tiff, png hoặc bmp 16 bit để sử dụng làm sơ đồ chiều cao trong công cụ trò chơi, công cụ không thực 4. Tôi đã thử chuyển đổi nó bằng gdal_translalte, đầu tiên thành 16 bit .raw nhưng hóa ra photoshop không thể mở Chỉ trong 16 bit, tôi nhận được một thông báo nói rằng kích thước là lớn đối với tệp trong 16 bit, điều này dường như phải làm với kích thước tệp theo byte, hai kênh và kích thước hình ảnh tôi cố gắng nhập khẩu. Sau đó, tôi đã thử chuyển đổi nó thành tiff và png, cũng với gdal_translate nhưng cả hai hình ảnh chỉ có màu đen khi tôi mở chúng. Tôi đã thử mở GeoTiff của mình với BelnderGIS nhưng nó chỉ là một mặt phẳng. Tôi đã mở Geotiff trong QGIS và sau đó tôi thấy rằng nó có thông tin và không chỉ phẳng và đen.

Có ai biết làm thế nào tôi có thể làm điều này, với gdal, qgis hoặc một cái gì khác? Tôi rất mới sử dụng cả gdal và qgis, tôi chỉ theo dõi các ví dụ từ những người khác nhưng cuối cùng có thể có một cách để làm điều đó để nó hoạt động với tôi.

Câu trả lời:


6

Tôi nghĩ vấn đề có thể là với phạm vi giá trị trong ảnh gốc của bạn. Bạn có thể sử dụng -scaletham số gdal_translateđể lấy hình ảnh trong phạm vi hình ảnh 8 bit.

Ví dụ

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

Điều này sẽ tự động đặt giá trị tối thiểu và tối đa đầu vào được sử dụng để chia tỷ lệ, nếu chúng không hoạt động, bạn có thể chỉ định giá trị tối thiểu và tối đa sau -scale.

Nếu bạn cần làm cho hình ảnh nhỏ hơn, bạn cũng có thể thay đổi kích thước bằng gdal_translatecách sử dụng -outsize. Ví dụ, -outsize 50% 50%sẽ thay đổi kích thước đến 50% so với ban đầu.


Vâng, nó dường như là một cái gì đó với phạm vi, khi tôi mở nó trong sagaGIS cả min và max là khoảng -5600. Tôi đã thử ví dụ của bạn và nó đã hoạt động nhưng những gì tôi muốn là 16 bit vì vậy tôi đã thử đưa UInt16 cho Unsign 16bit nhưng sau đó hình ảnh trở nên trắng, bạn có biết đầu vào đúng sẽ là gì để có Tiff hoặc PNG 16 bit không?
Stina_F

Bạn có thể chuyển tối đa đầu vào tối thiểu đầu vào và tối thiểu đầu ra tối đa cho tham số tỷ lệ để có đầu ra 16 bit. Nếu tối thiểu và tối đa đều là -5600, điều đó có nghĩa là tất cả các pixel có cùng giá trị (-5600), vì vậy tham số tỷ lệ sẽ không giúp ích.
danclewley

2
Cảm ơn bạn đã làm việc hoàn hảo! Giá trị tối thiểu và tối đa của tôi là -5660.574 và -5618.043 vì vậy tôi đã làm gdal_translate -of PNG -ot Float16 -scale -5660.574 -5618.043 0 65535 input.tif output.png
Stina_F

Chà, UInt16 là những gì tôi muốn nói ở đoạn mã trên thay vì Float16 mặc dù cả hai đều hoạt động.
Stina_F

Tôi có một câu hỏi khác liên quan đến vấn đề này, điều này có kéo dài các giá trị trên toàn phạm vi hay nó chỉ di chuyển chúng lên? Những gì tôi muốn là chỉ cần di chuyển chúng lên.
Stina_F

0

Với mục đích đó, tôi sử dụng tập lệnh Python. Nó có thể phân chia hình ảnh GeoTIFF lớn cho các ô nhỏ hơn với sự chồng chéo. Bản đồ chiều cao đầu ra đã sẵn sàng để sử dụng trong động cơ 4 không thực trong chế độ phát trực tuyến hoặc cảnh quan đơn (bố cục thế giới). Ở đây bạn có thể tìm thấy một lời giải thích chi tiết

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.