GeoTiff para tiff de 16 bits, imagem png ou bmp para mapa de altura

9

Eu tenho um GeoTiff que foi adquirido através do processamento de imagens estéreo Mars Hirise com ISIS3 e ASP. Quero convertê-lo em um arquivo tiff, png ou bmp em escala de cinza de 16 bits para usar como um mapa de altura em um mecanismo de jogo, mecanismo irreal 4. Tentei convertê-lo com gdal_translalte, primeiro para .raw de 16 bits, mas acontece que o photoshop não pode abrir em 16 bits apenas em 8 bits, recebo uma mensagem dizendo que o tamanho é grande demais para o arquivo em 16 bits, algo que parece ter a ver com o tamanho do arquivo em bytes, os dois canais e o tamanho da imagem que tento importar. Então tentei convertê-lo para tiff e png, também com gdal_translate, mas as duas imagens ficam pretas quando as abro. Tentei abrir meu GeoTiff com BelnderGIS, mas é apenas um plano. Abri o Geotiff no QGIS e vejo que ele tem informações e não é apenas liso e preto.

Alguém sabe como eu poderia fazer isso, com gdal, qgis ou algo mais? Eu sou muito novo em usar gdal e qgis, apenas segui exemplos de outras pessoas, mas pode haver uma maneira de fazer isso, para que funcione para mim no final.

Stina_F
fonte

Respostas:

6

Penso que o problema poderia estar na gama de valores da sua imagem original. Você pode usar o -scaleparâmetro gdal_translatepara obter imagens dentro do intervalo de uma imagem de 8 bits.

Por exemplo

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

Isso definirá automaticamente os valores mínimo e máximo de entrada usados ​​para dimensionar; se não funcionarem, você poderá especificar um valor mínimo e máximo depois -scale.

Se você precisar diminuir a imagem, também poderá redimensionar com o gdal_translateuso -outsize. Por exemplo, -outsize 50% 50%será redimensionado para 50% do original.

danclewley
fonte
Sim, parece ser algo com o intervalo, quando eu abro no sagaGIS min e max é em torno de -5600. Eu tentei o seu exemplo e funcionou, mas o que eu quero é 16 bits, então eu tentei colocar o UInt16 para Unsigned 16bit, mas a imagem fica branca, você sabe qual seria a entrada correta para obter um Tiff ou PNG de 16 bits?
Stina_F 16/08
Você pode passar a entrada mínima máxima e a saída mínima máxima para o parâmetro de escala para obter uma saída de 16 bits. Se o mínimo e o máximo forem ambos -5600, isso significaria que todos os pixels têm o mesmo valor (-5600), para que o parâmetro de escala não ajude.
danclewley
2
Obrigado que funcionou perfeitamente! Meus valores mínimo e máximo são -5660.574 e -5618.043, então fiz gdal_translate -of PNG -ot Float16 -scale -5660.574 -5618.043 0 65535 input.tif output.png
Stina_F 17/17/16
Bem, UInt16 foi o que eu quis dizer no código acima, em vez de Float16, embora ambos funcionem.
Stina_F
Eu tenho uma outra pergunta sobre isso, isso estica os valores em todo o intervalo ou apenas os move para cima? O que eu quero é apenas movê-los para cima.
Stina_F
0

Para esse efeito, eu uso o script Python. Ele pode dividir uma imagem grande do GeoTIFF para blocos menores com sobreposição. O mapa de altura de saída está pronto para uso no mecanismo irreal 4 em paisagem única ou streaming de níveis (composição mundial). Aqui você pode encontrar uma explicação detalhada

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
fonte