GDAL перевод масштаба и сохранить в JPG, используя Python - PullRequest
0 голосов
/ 24 мая 2018

Я знаю, как использовать gdal translate для масштабирования и сохранения в jpg через строку cmd:

gdal_translate image.bsq image.jpg -of JPEG -outsize 10% 10% -scale

Это дает (то, что я называю хорошим изображением):

enter image description here

Я хотел бы создать похожее изображение через python, что-то вроде:

from osgeo import gdal
img_bsq  = 'image.bsq'
img_jpg  = 'image.jpg'  
gdal.Translate(img_jpg, img_bsq, format='JPEG', width=1024, height=0, scaleParams=[[500,1000,10,20]])

Я думаю, что вопрос заключается в том, как правильно выбрать scaleParams.Кажется, -scale в строке cmd вычисляет значения автоматически, согласно man gdal_translate:

-scale [src_min src_max [dst_min dst_max]]:
           Rescale the input pixels values from the range src_min to src_max to the range dst_min to dst_max. If omitted the output range is 0
           to 255. If omitted the input range is automatically computed from the source data.

Любой совет о том, как выбрать scaleParams (или другие соответствующие параметры)?

1 Ответ

0 голосов
/ 24 мая 2018

Вы также можете оставить это поле пустым, например:

gdal.Translate(img_jpg, img_bsq, format='JPEG', width=1024, height=0, scaleParams=[[]])

Это заставит GDAL самому угадать, как описано в документации:

-scale [src_min src_max [dst_min dst_max]]: изменить масштаб значений входных пикселей от диапазона src_min до src_max до диапазона от dst_min до dst_max.Если опущено, выходной диапазон составляет от 0 до 255. Если опущено, входной диапазон автоматически вычисляется из исходных данных.

http://www.gdal.org/gdal_translate.html

В качестве альтернативы, вы также можете получить статистику (на группу) и сделайте что-нибудь самостоятельно.

Получение статистики:

ds = gdal.Open('img_bsq')
stats = [ds.GetRasterBand(i+1).GetStatistics(True, True) for i in range(ds.RasterCount)]
ds = None

vmin, vmax, vmean, vstd = zip(*stats)

С помощью этой статистики вы сможете получить желаемое растяжение.Если вы хотите масштабировать между минимальным и максимальным значениями для каждой полосы, вы можете сделать:

scaleParams = list(zip(*[vmin, vmax]))

или если вы хотите использовать абсолютный максимум и минимум (по всем диапазонам)

scaleParams = [[min(vmin), max(vmax)]]

и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...