如何在Python或Java中将GeoTIFF转换为JPG?

5
我有一些具有3个波段的Geotiff图像。
其中,波段1和2是实际图像值,而波段3是实例角度值。
波段1和2是float32数据类型。
以下是我之前尝试过的代码。但它没有起作用。
我认为波段数据的范围太大了,所以它不起作用。
from osgeo import gdal, osr, ogr
from PIL import Image
import numpy as np


ds = gdal.Open('image path', gdal.GA_ReadOnly)
rb = ds.GetRasterBand(1)
test = rb.ReadAsArray()
rb2 = ds.GetRasterBand(2)
test2 = rb2.ReadAsArray()
rb3 = ds.GetRasterBand(3)
test3 = rb3.ReadAsArray()
slice56 = test2
formatted = (slice56 * 255 / np.max(slice56)).astype('uint8')
img = Image.fromarray(formatted)
img.save('save image path')

我该如何解决这个问题?
3个回答

11

您可以使用gdal.Translate来实现这一点。

您可以在这里阅读相关文档。

from osgeo import gdal
    
options_list = [
    '-ot Byte',
    '-of JPEG',
    '-b 1',
    '-scale'
]           

options_string = " ".join(options_list)
    
gdal.Translate(
    'save_image_path.jpg',
    'image_path.tif',
    options=options_string
)

上述代码仅将第1个波段缩放为字节范围并创建了一个jpg文件。您可以通过添加'-b 2'等来添加更多波段。此外,请注意,scale会自动包装整个范围到字节范围内。如果您喜欢其他值,可以使用'-scale min_val max_val'指定所需的范围,因为通常您无需使用最低或最高可用值。


2

以上方法对我很有效,但JPEG的分辨率不是很好。将JPEG更换为PNG效果更佳。


0

我已经编写了以下模块,更多的内容可以在我的GitHub上找到:

import os
from osgeo import gdal

def geotiff_to_png(input_path, output_path=None, return_object=False):
"""
Converts a GeoTIFF file to a PNG file or object. Specific to Skysatimages with 4 bands (blue, green, red, nir).

Args:
    input_path (str): The file path of the input GeoTIFF file.
    output_path (str, optional): The file path of the output PNG file. If not provided, PNG object is returned. Defaults to None.
    return_object (bool, optional): Whether to return the PNG data as an object. If True, the output_path parameter will be ignored. Defaults to False.

Returns:
    numpy.ndarray or None: If output_path is not provided and return_object is True, returns a 3D numpy array representing the PNG image. Otherwise, returns None.

"""
# Open input file
dataset = gdal.Open(input_path)
output_types = [gdal.GDT_Byte, gdal.GDT_UInt16, gdal.GDT_Float32]

# Define output format and options
options = gdal.TranslateOptions(format='PNG', bandList=[3,2,1], creationOptions=['WORLDFILE=YES'], outputType=output_types[0])

# Translate to PNG
if output_path is not None:
    gdal.Translate(output_path, dataset, options=options)
    print(f'Successfully saved PNG file to {output_path}')

# Return PNG object
if return_object:
    mem_driver = gdal.GetDriverByName('MEM')
    mem_dataset = mem_driver.CreateCopy('', dataset, 0)
    png_data = mem_dataset.ReadAsArray()
    return png_data

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接