Existem 2 partes do problema. A primeira é que você deseja converter de 16 bits para 8 bits, e a opção -scale de gdal_translate faz isso, conforme mencionado na resposta anterior.
-scale minOriginal maxOriginal minOutput maxOutput
O segundo problema é um problema de aprimoramento de contraste: quando você redimensiona, deseja ter um alto contraste para os pixels em que está interessado. AVISO: Não há contraste "mágico" porque, quando você redimensiona, geralmente perde algumas informações : isso é feito para melhorar a visualização dos dados, e os softwares profissionais fazem isso rapidamente, sem precisar escrever um novo arquivo. Se você deseja continuar processando seus dados, seu geotiff "preto" contém as mesmas informações que seu jp2 e está pronto para ser processado. Se você calcular, por exemplo, o índice de vegetação, isso deve ser feito com os valores de refletância "originais", não com os redimensionados. Dito isto, aqui estão algumas etapas para criar uma imagem de 8 bits visualmente aprimorada.
O @ben forneceu um método genérico para redimensionar a refletância de 0-1 (multiplicado por 10000 com este produto) para 0-255. Isso é seguro (sem exclusão), mas apenas nuvens e alguns solos nus têm refletâncias realmente altas, para que você não veja muito em terra (exceto solos nus) e nada na água. Portanto, os aprimoramentos de contraste comumente aplicados nas imagens consistem em capturar apenas um subconjunto de toda a faixa. No lado seguro, você pode usar o conhecimento de que a refletância máxima do material comum da superfície da Terra geralmente é inferior a 0,5 / 0,6 (veja aquipara alguns exemplos). Obviamente, isso pressupõe que sua imagem foi corrigida atmosférica (imagens L2A). No entanto, o alcance da refletância difere em cada banda espectral e você nem sempre tem as superfícies mais brilhantes da Terra em sua área de interesse. Aqui está a aparência do método "seguro" (com uma refletância máxima de 0,4, como o 4096 sugerido por @RoVo)
Por outro lado, o contraste pode ser otimizado para cada banda. Você pode definir esse intervalo manualmente (por exemplo, se interessa pela cor da água e conhece o valor máximo esperado de refletância da água) ou com base nas estatísticas da imagem. Um método comumente usado consiste em manter aproximadamente 95% dos valores e em "descartar" (muito escuro -> 0 ou muito claro -> 255) o restante, o que é semelhante à definição do intervalo com base no valor médio +/- 1,96 * desvio padrão. Obviamente, isso é apenas uma aproximação, pois assume uma distribuição normal, mas funciona muito bem na prática (exceto quando você tem muitas nuvens ou se as estatísticas usam alguns valores NoData).
Vamos pegar sua primeira banda como exemplo:
média = 320
std = 536
Intervalo de confiança de 95% = [-731: 1372]
mas é claro que a refletância é sempre maior que zero, portanto, você deve definir o mínimo em 0.
gdal_translate -scale 0 1372 0 255 -ot Byte B01.jp2 B01-scaled.tif
E se você possui uma versão recente do gdal, pode usar -scale_ {band #} (0 255 é a saída padrão, portanto não a repito) para que você não precise dividir as bandas únicas. Também usei vrt em vez de tif como um arquivo intermediário (não há necessidade de escrever uma imagem completa: basta uma virtual)
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
Observe que suas estatísticas são fortemente afetadas por "artefatos", como nuvens e NoData. Por um lado, a variação é superestimada quando você tem valores extremos. Por outro lado, sua média é subestimada quando há uma grande quantidade de valores "zero" (tornando a imagem contrastada automaticamente muito brilhante como no exemplo) e seria superestimada se houvesse uma maioria de nuvens (o que tornaria a imagem muito escura). Nesse estágio, os resultados não seriam os melhores que você poderia obter.
Uma solução automatizada seria definir valores de segundo plano e nuvem como "nodata" e calcular suas estatísticas sem o NoData (consulte esta postagem para obter detalhes sobre estatísticas de computação sem o NoData, e este por exemplo, para definir valores maiores que 4000 no NoData também ) Para uma única imagem, costumo calcular as estatísticas do maior subconjunto possível de nuvens. Com estatísticas de um subconjunto em que não há "NoData" (canto superior esquerdo da sua imagem), isso fornece o resultado final. Você pode ver que o intervalo é cerca da metade do intervalo "seguro", o que significa que você tem o dobro de contraste:
gdal_translate -scale_1 38 2225 -scale_2 553 1858 -scale_3 714 1745 -ot Byte stack.vrt im_rescaled.tif
Como última observação, gdal_constrast_stretch parece bom, mas eu não testei
gdalinfo -hist merged.tif