Hay 2 partes del problema. La primera es que desea convertir de 16 bits a 8 bits, y la opción de escala de gdal_translate lo hace, como se mencionó en la respuesta anterior.
-scale minOriginal maxOriginal minOutput maxOutput
El segundo problema es un problema de mejora de contraste: cuando cambia la escala, desea tener un alto contraste para los píxeles que le interesan. ADVERTENCIA: No hay contraste "mágico" porque, cuando cambia la escala, generalmente pierde alguna información : se hace para mejorar la visualización de los datos, y los softwares profesionales lo hacen sobre la marcha sin escribir un nuevo archivo. Si desea procesar aún más sus datos, su geotiff "negro" contiene la misma información que su jp2 y está listo para ser procesado. Si calcula, por ejemplo, el índice de vegetación, esto debe hacerse con los valores de reflectancia "originales", no con los valores reescalados. Dicho esto, aquí hay algunos pasos para crear una imagen de 8 bits visualmente mejorada.
@ben le dio un método genérico para reescalar la reflectancia de 0-1 (multiplicado por 10000 con este producto) a 0-255. Esto es seguro (sin exclusión), pero solo las nubes y algunos suelos desnudos tienen reflejos muy altos, por lo que no se ve mucho en la tierra (excepto los suelos desnudos) y nada en el agua. Por lo tanto, las mejoras de contraste que se aplican comúnmente en las imágenes consisten en tomar solo un subconjunto del rango completo. En el lado seguro, puede usar el conocimiento de que la reflectancia máxima del material de la superficie de la Tierra común generalmente está por debajo de 0.5 / 0.6 (consulte aquípara algunos ejemplos) Por supuesto, esto supone que su imagen ha sido corregida atmosféricamente (imágenes L2A). Sin embargo, el rango de reflectancia difiere en cada banda espectral y no siempre tiene las superficies terrestres más brillantes en su área de interés. Así es como se ve el método "seguro" (con una reflectancia máxima de 0.4, como el 4096 sugerido por @RoVo)
Por otro lado, el contraste podría optimizarse para cada banda. Puede definir este rango manualmente (por ejemplo, si está interesado en el color del agua y conoce el valor máximo de reflectancia esperado del agua) o en función de las estadísticas de la imagen. Un método comúnmente usado consiste en mantener aproximadamente el 95% de los valores y "descartar" (demasiado oscuro -> 0 o demasiado brillante -> 255) el resto, que es similar a definir el rango basado en el valor medio +/- 1.96 * Desviación Estándar. Por supuesto, esto es solo una aproximación porque supone una distribución normal, pero funciona bastante bien en la práctica (excepto cuando tiene demasiadas nubes o si las estadísticas hacen uso de algunos valores NoData).
Tomemos su primera banda como ejemplo:
media = 320
std = 536
Intervalo de confianza del 95% = [-731: 1372]
pero, por supuesto, la reflectancia siempre es mayor que cero, por lo tanto, debe establecer el mínimo en 0.
gdal_translate -scale 0 1372 0 255 -ot Byte B01.jp2 B01-scaled.tif
Y si tiene una versión reciente de gdal, puede usar -scale_ {band #} (0 255 es la salida predeterminada, por lo que no lo repito) para que no necesite dividir bandas individuales. También usé vrt en lugar de tif como archivo intermedio (no es necesario escribir una imagen completa: una virtual es suficiente)
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
Tenga en cuenta que sus estadísticas se ven fuertemente afectadas por "artefactos" como nubes y NoData. Por un lado, la varianza se sobreestima cuando tiene valores extremos. Por otro lado, su promedio se subestima cuando hay una gran cantidad de valores "cero" (haciendo que la imagen contrastada automáticamente sea demasiado brillante como en el ejemplo) y se sobreestimaría si hubiera una mayoría de nubes (lo que haría que imagen demasiado oscura). Por lo tanto, en esta etapa, los resultados no serían los mejores que podría obtener.
Una solución automatizada sería establecer valores de fondo y de nube en "nodata" y calcular sus estadísticas sin NoData (consulte esta publicación para obtener detalles sobre cómo calcular estadísticas sin NoData, y esta también como ejemplo para establecer valores superiores a 4000 en NoData ) Para una sola imagen, generalmente calculo las estadísticas en el subconjunto más grande posible sin nubes. Con estadísticas de un subconjunto donde no hay "NoData" (arriba a la izquierda de su imagen), esto da el resultado final. Puede ver que el rango es aproximadamente la mitad del rango "seguro", lo que significa que tiene el doble de contraste:
gdal_translate -scale_1 38 2225 -scale_2 553 1858 -scale_3 714 1745 -ot Byte stack.vrt im_rescaled.tif
Como último comentario, gdal_constrast_stretch se ve bien pero no lo he probado
gdalinfo -hist merged.tif