Ci sono 2 parti del problema. Il primo è che vuoi convertire da 16 bit a 8 bit, e l'opzione -scale di gdal_translate lo fa, come menzionato nella risposta precedente.
-scale minOriginal maxOriginal minOutput maxOutput
Il secondo problema è un problema di miglioramento del contrasto: quando ridimensioni, vuoi avere un contrasto elevato per i pixel che ti interessano. AVVERTENZA: non c'è contrasto "magico" perché, quando ridimensioni, di solito perdi alcune informazioni : viene fatto per migliorare la visualizzazione dei dati e software professionali lo fanno al volo senza scrivere un nuovo file. Se vuoi elaborare ulteriormente i tuoi dati, il tuo geotiff "nero" contiene le stesse informazioni del tuo jp2 ed è pronto per essere elaborato. Se si calcola, ad esempio, l'indice di vegetazione, questo dovrebbe essere fatto con i valori di riflettanza "originali", non quelli riscalati. Detto questo, ecco alcuni passaggi per creare un'immagine 8bit visivamente migliorata.
@ben ti ha dato un metodo generico per ridimensionare la riflettanza da 0-1 (moltiplicata per 10000 con questo prodotto) a 0-255. Questo è sicuro (nessuna esclusione), ma solo le nuvole e alcuni terreni nudi hanno riflessioni molto alte, quindi non si vede molto sulla terra (tranne i terreni nudi) e niente nell'acqua. Pertanto, i miglioramenti del contrasto comunemente applicati alle immagini consistono nel prendere solo un sottoinsieme dell'intera gamma. Per quanto riguarda la sicurezza, è possibile utilizzare la consapevolezza che la riflettanza massima del materiale comune della superficie terrestre è generalmente inferiore a 0,5 / 0,6 (vedere quiper alcuni esempi). Naturalmente, questo presuppone che la tua immagine sia stata corretta atmosfericamente (immagini L2A). Tuttavia, la gamma di riflettanza differisce in ciascuna banda spettrale e non sempre hai le superfici della Terra più luminose nella tua area di interesse. Ecco come appare il metodo "sicuro" (con una riflettanza massima di 0,4, come il 4096 suggerito da @RoVo)
D'altra parte, il contrasto potrebbe essere ottimizzato per ogni banda. È possibile definire questo intervallo manualmente (ad esempio, se si è interessati al colore dell'acqua e si conosce il valore massimo di riflettanza atteso dell'acqua) o in base alle statistiche dell'immagine. Un metodo comunemente usato consiste nel mantenere circa il 95% dei valori e nel "scartare" (troppo scuro -> 0 o troppo luminoso -> 255) il resto, il che è simile alla definizione dell'intervallo in base al valore medio +/- 1,96 * deviazione standard. Naturalmente, questa è solo un'approssimazione perché presuppone una distribuzione normale, ma in pratica funziona abbastanza bene (tranne quando hai troppe nuvole o se le statistiche fanno uso di alcuni valori NoData).
Prendiamo la tua prima band come esempio:
media = 320
std = 536
Intervallo di confidenza al 95% = [-731: 1372]
ma ovviamente la riflettanza è sempre maggiore di zero, quindi è necessario impostare il minimo su 0.
gdal_translate -scale 0 1372 0 255 -ot Byte B01.jp2 B01-scaled.tif
E se hai una versione recente di gdal, puoi usare -scale_ {band #} (0 255 è l'output predefinito, quindi non lo ripeto) in modo da non dover dividere singole bande. Inoltre ho usato vrt invece di tif come file intermedio (non è necessario scrivere un'immagine completa: ne basta uno virtuale)
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
Nota che le tue statistiche sono fortemente influenzate da "artefatti" come nuvole e NoData. Da un lato, la varianza viene sopravvalutata quando si hanno valori estremi. D'altra parte, la tua media è sottovalutata quando c'è una grande quantità di valori "zero" (rendendo l'immagine a contrasto automatico troppo luminosa come nell'esempio) e sarebbe sopravvalutata se ci fosse una maggioranza di nuvole (che renderebbe il immagine troppo scura). In questa fase, i risultati non sarebbero quindi i migliori che si possano ottenere.
Una soluzione automatizzata sarebbe quella di impostare i valori di sfondo e cloud su "nodata" e calcolare le tue statistiche senza NoData (vedi questo post per dettagli sulle statistiche di calcolo senza NoData, e questo per un esempio per impostare valori maggiori di 4000 anche su NoData ). Per una singola immagine, di solito calcolo le statistiche sul più grande sottoinsieme possibile senza cloud. Con le statistiche di un sottoinsieme in cui non ci sono "NoData" (in alto a sinistra dell'immagine), questo dà il risultato finale. Puoi vedere che l'intervallo è circa la metà dell'intervallo "sicuro", il che significa che hai il doppio del contrasto:
gdal_translate -scale_1 38 2225 -scale_2 553 1858 -scale_3 714 1745 -ot Byte stack.vrt im_rescaled.tif
Come ultima osservazione, gdal_constrast_stretch sembra buono ma non ho ancora testato
gdalinfo -hist merged.tif