Есть 2 части проблемы. Во-первых, вы хотите преобразовать из 16 бит в 8 бит, и опция -scale в gdal_translate это делает, как упоминалось в предыдущем ответе.
-scale minOriginal maxOriginal minOutput maxOutput
Вторая проблема - это проблема повышения контрастности: когда вы изменяете масштаб, вы хотите иметь высокую контрастность для интересующих вас пикселей. ПРЕДУПРЕЖДЕНИЕ. «Волшебный» контраст отсутствует, поскольку при изменении масштаба вы обычно теряете некоторую информацию : это делается для улучшения визуализации данных, и профессиональные программы делают это на лету, не записывая новый файл. Если вы хотите продолжить обработку ваших данных, ваш «черный» геотиф содержит ту же информацию, что и ваш jp2, и готов к обработке. Если вы вычисляете, например, индекс растительности, это следует делать с «исходными» значениями отражательной способности, а не с пересчитанными. При этом, вот несколько шагов для создания визуально улучшенного 8-битного изображения.
@ben дал вам общий метод для изменения масштаба отражения от 0-1 (умноженный на 10000 с этим продуктом) до 0-255. Это безопасно (не исключая), но только облака и некоторые голые почвы имеют очень высокую отражательную способность, поэтому вы не видите много на суше (кроме голых почв) и ничего в воде. Следовательно, контрастные улучшения, обычно применяемые к изображениям, заключаются в том, чтобы брать только подмножество полного диапазона. На всякий случай, вы можете использовать знания о том, что максимальная отражательная способность материала общей поверхности Земли обычно ниже 0,5 / 0,6 (см. Здесьдля некоторых примеров). Конечно, это предполагает, что ваше изображение было атмосферно скорректировано (изображения L2A). Тем не менее, диапазон отражательной способности отличается в каждой спектральной полосе, и у вас не всегда самые яркие поверхности Земли в вашей области интересов. Вот как выглядит «безопасный» метод (с максимальной отражательной способностью 0,4, как 4096, предложенный @RoVo)
С другой стороны, контраст можно оптимизировать для каждой полосы. Вы можете определить этот диапазон вручную (например, вас интересует цвет акварели и вы знаете максимальное ожидаемое значение отражения воды) или на основе статистики изображения. Обычно используемый метод заключается в сохранении приблизительно 95% значений и «отбрасывании» (слишком темный -> 0 или слишком яркий -> 255) остальных, что аналогично определению диапазона на основе среднего значения +/- 1,96 * среднеквадратичное отклонение. Конечно, это только приблизительное значение, поскольку оно предполагает нормальное распределение, но на практике работает довольно хорошо (за исключением случаев, когда у вас слишком много облаков или если статистика использует некоторые значения NoData).
Давайте возьмем вашу первую группу в качестве примера:
среднее = 320
стандартный = 536
95% доверительный интервал = [-731: 1372]
но, конечно, коэффициент отражения всегда больше нуля, поэтому вы должны установить минимум на 0.
gdal_translate -scale 0 1372 0 255 -ot Byte B01.jp2 B01-scaled.tif
А если у вас последняя версия gdal, вы можете использовать -scale_ {band #} (0 255 - выход по умолчанию, поэтому я не повторяю его), чтобы вам не приходилось разделять отдельные полосы. Также я использовал vrt вместо tif в качестве промежуточного файла (не нужно писать полное изображение: достаточно виртуального)
gdalbuildvrt -separate stack.vrt B04.jp2 B03.jp2 B02.jp2
gdal_translate -scale_1 0 1372 -scale_2 0 1397 -scale_3 0 1430 -ot Byte stack.vrt im_rescaled.tif
Обратите внимание, что на вашу статистику сильно влияют "артефакты", такие как облака и NoData. С одной стороны, дисперсия завышена, когда у вас есть экстремальные значения. С другой стороны, ваше среднее значение занижено, когда имеется большое количество «нулевых» значений (что делает автоматически контрастное изображение слишком ярким, как в примере), и оно будет завышено, если будет большинство облаков (что приведет к изображение слишком темное). Поэтому на данном этапе результаты не будут лучшими, которые вы могли бы получить.
Автоматизированным решением было бы установить фоновые и облачные значения для «nodata» и вычислить вашу статистику без NoData (см. Этот пост для получения подробной информации о вычислении статистики без NoData, и этот пример для примера, чтобы установить значения больше 4000 для NoData также ). Для одного изображения я обычно вычисляю статистику для максимально возможного безоблачного подмножества. Со статистикой из подмножества, где нет «NoData» (вверху слева от вашего изображения), это даст окончательный результат. Вы можете видеть, что диапазон составляет примерно половину «безопасного» диапазона, что означает, что у вас вдвое больше контраста:
gdal_translate -scale_1 38 2225 -scale_2 553 1858 -scale_3 714 1745 -ot Byte stack.vrt im_rescaled.tif
Как последнее замечание, gdal_constrast_stretch выглядит хорошо, но я не проверял
gdalinfo -hist merged.tif