La profondità colore

Dopo aver passato in rassegna le caratteristiche dei tre spazi colore RGB più utilizzati in fotografia digitale, siamo quasi pronti per analizzarli e confrontarli da un punto di vista più pratico. Resta però da approfondire ancora un aspetto, a cui in realtà abbiamo già accennato un po' di volte: la profondità colore in bit (bit depth). Tutto l'articolo potrebbe essere riassunto in poche righe, ma è interessante il percorso che si segue per arrivare a determinate conclusioni, anche perchè molta terminologia e molti concetti introdotti nel seguito si incontrano più volte durante il normale flusso di lavoro di ogni fotografo. E quindi bene avere le idee molto chiare su questo tema.

 

Riprendiamo ancora una volta  il diagramma di cromaticità:

All'interno del diagramma (che, ricordiamolo sempre, è una rappresentazione semplificata dello spazio CIEXYZ tridimensionale) sono rappresentati tutti i colori visibili dall'occhio umano, identificati come abbiamo visto da una coppia di coordinate (x,y). Secondo questa rappresentazione matematica dei colori, il loro numero è tecnicamente infinito. Questa considerazione è scontata per chi non è completamente a digiuno di conoscenze matematiche, ma è di facile comprensione per chiunque. Se prendiamo ad esempio il verde di coordinate (0.3,0.5), non è possibile trovare il verde "più vicino" ad esso, perchè qualunque punto vicino a quel verde prendiamo, ce ne sarà sempre un altro ancora più vicino. Spostandoci verso l'alto in verticale, troviamo il verde di coordinate (0.3,0.51), ma prima ancora il verde (0.3,0.501), prima ancora il verde (0.3,0.5001)...e così via, all'infinito appunto.

 

Per operare con i numeri nel mondo digitale è necessario quindi procedere a una discretizzazione di questo insieme infinito di colori, riducendoli ad un numero finito, ben determinato. Teniamo presente tra l'altro che essendo i colori basati sulla nostra percezione, non avrebbe senso parlare di un numero infinito di colori, semplicemente perchè nel mondo reale non esistono. Secondo alcune stime, noi siamo in grado di percepire intorno agli 8 milioni di colori distinti. Qualsiasi altra sfumatura di "colore", pur essendo identificata da una diversa rappresentazione matematica, ai nostri occhi coinciderebbe con uno di questi 8 milioni di colori, e quindi non potrebbe essere definita come un altro colore.

 

Abbiamo visto che negli spazi colore RGB ogni colore è rappresentato da una terna (R,G,B) dove ciascuna componente indica il livello di saturazione del colore primario corrispondente, variabile da 0 a un certo valore massimo. E' proprio qui che avviene la discretizzazione di cui abbiamo parlato. Si parla di profondità in bit per canale: i valori R,G,B possono assumere un numero finito di valori, determinato del numero di bit (ossia lo spazio in memoria utilizzato) scelto per la loro rappresentazione.

 

I valori utilizzati di solito sono 8 bit o 16 bit (i 32 bit stanno prendendo piede solo negli ultimi anni). Ricordiamo che nel mondo digitale, fissati N bit, il numero di valori rappresentabili è pari a 2^N, di conseguenza si ha:

 

8 bit  -> 2^8 = 256 possibili valori per ogni canale

Avendo tre canali, si potranno rappresentare  256 x 256 x 256 = 16.777.216 colori

 

16 bit -> 2^16 = 65.536 possibili valori per ogni canale

Avendo tre canali, si potranno rappresentare  65.536 x 65.536 x 65.536 = oltre 281.000 miliardi di colori!

 

A 8 bit ogni colore sarà rappresentato quindi da una terna (R,G,B) dove ciascuna componente va da 0 a 255 (256 valori in tutto per canale).

(0,0,0) rappresenta il nero, (255,255,255) rappresenta il bianco. Con 8 bit per canale, abbiamo 24 bit per pixel.

 

A 16 bit ogni colore sarà rappresentato da una terna (R,G,B) dove ciascuna componente varia tra 0 e 65535 (65536 valori in tutto per canale).

(0,0,0) rappresenta il nero mentre (65536,65536,65536) rappresenta il bianco. Con 16 bit per canale, abbiamo 48 bit per pixel.

 

Probabilmente molti di voi hanno già confidenza con le terne di valori in Photoshop o altri programmi di elaborazione, ma è meglio vedere subito un esempio pratico in modo che quanto detto sia chiaro a tutti:

In Photoshop muovendo il cursore sull'immagine è possibile vedere istantaneamente (nel pannello Info) i valori delle componenti (R,G,B) di qualsiasi pixel. In questa immagine (a 8 bit) ho riportato questi valori in corrispondenza dei punti evidenziati in rosso. Per il punto del cielo in alto a sinistra si ha (19,17,18), quindi valori molto bassi e quasi uguali tra loro che indicano una tinta molto scura e neutra (il cielo infatti è quasi nero). All'opposto, sul lampione si ha (238,238,238), valori molto vicini a 255, il bianco puro. Sulla fontanella abbiamo invece (38,64,39), una terna di valori che indica una tinta scura con prevalenza netta del canale verde, come giustamente deve essere.

 

E' importante capire che a 16 bit questi valori sarebbero completamente diversi e che, a parte la terna (0,0,0) che rappresenta sempre il nero puro, a terne uguali corrispondono colori diversi se si lavora a 8 o a 16 bit. Ad esempio, a 16 bit la terna (238,238,238) corrisponderebbe non più a un colore molto luminoso ma addirittura a un grigio molto scuro, quasi nero, dato che sulla scala da 0 a 65.536 il valore 238 è molto piccolo.

 

Una piccola osservazione. Quanto appena detto vale nel caso di 16 bit reali. Giusto per complicare un po' le cose, in realtà in modalità 16 bit Photoshop non lavora a 16 bit, ma a 15 bit più una unità: il numero di colori rappresentabili per ogni canale è pari a (2^15)+1 = 32769, quindi ogni canale varierà tra 0 e 32768. Qui sotto è mostrata ad esempio la terna di valori mostrata da Photoshop quando si passa il puntatore su un pixel di colore bianco:

Fortunatamente, ai fini di questo articolo ma anche dell'utilità pratica per un fotografo di qualsiasi livello, i motivi tecnici dietro a questa soluzione sono di interesse assolutamente nullo.


8 bit o 16 bit?

A questo punto viene naturale chiedersi: durante il nostro flusso di lavoro, esattamente a che punto si pone il problema di scegliere il valore della profondità in bit? La risposta è molto semplice: la scelta riguarda principalmente la fase di post produzione.

 

In fase di scatto non abbiamo molta scelta: i JPEG supportano solo gli 8 bit, quindi se scattiamo in JPEG le nostre foto saranno a 8 bit per canale. Se scattiamo in RAW, di solito possiamo scegliere nel menu della fotocamera se registrarli a 12 o 14 bit: selezioniamo senza pensarci due volte il valore più alto disponibile, in modo da sfruttare al massimo il sensore della nostra fotocamera.

 

Ma anche nella fase conclusiva del lavoro, al momento di salvare/esportare il nostro file, le scelte appaiono quasi obbligate. Intanto, se il nostro file sarà salvato in JPEG, come abbiamo appena visto esso sarà in ogni caso a 8 bit (quindi anche se in post produzione abbiamo lavorato a 16 bit, salvando la foto in JPEG avverrà automaticamente una conversione a 8 bit). Se il file verrà salvato in un formato che supporta i 16 bit, come il TIFF o il PSD, potremo valutare a seconda della destinazione del file (ad esempio, seguendo le specifiche richieste dal laboratorio di stampa, alcuni laboratori accettano TIFF a 16 bit), ma sembrerebbe che le differenze nella resa di stampa tra un file a 8 bit e uno a 16 bit siano praticamente nulle (mentre può essere importante lo spazio colore, come vedremo nel prossimo articolo). Si può dire in pratica che l'unica buona ragione per salvare un TIFF o PSD a 16 bit è quella di conservare un file master alla massima qualità possibile.

 

Concentriamoci quindi sulla fase di post produzione. In Photoshop basta selezionare la voce desiderata all'interno del menu Immagine -> Metodo

Quale valore è meglio? Alla luce delle considerazioni fatte, 16 bit non sembrerebbero portare alcun vantaggio. Possono rappresentare 281.000 miliardi di colori quando noi non riusciamo a vederne più di 8 milioni, come abbiamo visto salvare a 16 bit non porta alcun vantaggio pratico e 16 bit significa anche molta più memoria utilizzata.  Allora dove sta la loro utilità? Per mostrarlo, la cosa migliore è fare un esempio pratico.

 

In Photoshop creiamo un nuovo documento a 8 bit e tracciamo un gradiente uniforme dal bianco al nero: 

Il passaggio dal bianco al nero avviene in modo graduale, e infatti l'istogramma appare continuo. Osserviamo però cosa succede se applico due curve il cui effetto globale dovrebbe essere neutro (la prima per sottoesporre e la seconda per sovraesporre):

Le sfumature non risultano più graduali ma appaiono delle bande nettamente distinguibili. L'istogramma infatti mostra chiaramente che ora mancano i pixel corrispondenti a certi valori di luminosità. Questo effetto è noto come posterizzazione, o in inglese banding. Perché si verifica? Esso è una conseguenza del fatto che in digitale non sono ammessi decimali, quindi i risultati delle operazioni che agiscono sui valori dei canali devono sempre essere troncate a valori interi.

 

Consideriamo ad esempio dei pixel di luminosità via via decrescente con  i seguenti valori RGB (le tre componenti sono uguali dato che siamo in scala di grigi)

 

(30,30,30)  (29,29,29)  (28, 28,28)  (27,27,27)  (26,26,26)  (25,25,25)

 

Immaginiamo che la prima curva dimezzi la loro luminosità. I valori pari verranno divisi per due, quelli dispari verranno arrotondati per difetto:

 

(15,15,15)  (14,14,14)  (14,14,14)  (13,13,13)  (13,13,13)  (12,12,12)

 

La seconda curva invece raddoppia i valori di luminosità quindi risulterà

 

(30,30,30)  (28, 28,28)  (28, 28,28)  (26,26,26)  (26,26,26)  (24,24,24)

 

Ed ecco che abbiamo perso alcuni valori di luminosità intermedie! Quindi invece di tornare alla situazione iniziale, come dovrebbe risultare dall'applicazione di due curve di effetto uguale e contrario, abbiamo ottenuto una serie di tonalità discontinue. Nonostante questo esempio sia un po' forzato, non è escluso che durante la post produzione, soprattutto con molti livelli di regolazione, gli errori di troncamento si accumulino e diano origine a questo problema.

 

E' un effetto molto visibile ad esempio nei cieli, dove al posto delle sfumature graduali di blu si formano delle bande di colore uniforme (guardate in particolare la zona sopra la Mole Antonelliana):

Questo effetto, se la foto verrà stampata, risulterà molto pronunciato e darà alla stampa un aspetto assolutamente poco professionale.

 

Facendo le stesse operazioni in modalità 16 bit, questo problema invece non si presenta. Questo è dovuto al fatto che lavorando a 16 bit le sfumature sono così tante (65.536 contro le sole 256 degli 8 bit) che le eventuali tonalità di colore "saltate"  a causa di troncamenti numerici sono assolutamente invisibili ai nostri occhi. Ma c'è di più: se eseguiamo queste operazioni a 16 bit, uniamo i livelli e poi selezioniamo dal menu Immagine->Metodo 8 bit (il che vuol dire convertire da 16 bit a 8 bit), il gradiente rimane uniforme, senza posterizzazione:

Questo avviene perchè la conversione mantiene le sfumature graduali. Ma è fondamentale unire i livelli PRIMA della conversione, perchè in questo modo i calcoli numerici svolti da Photoshop per applicare le curve sono svolti a 16 bit e poi il risultato convertito a 8 bit, che è quello che ci interessa. Se convertiamo da 16 a 8 bit senza unire i livelli, e quindi a 8 bit ci ritroviamo il nostro livello di sfondo più i due livelli di regolazione con le curve, i conti sulle curve saranno applicati a 8 bit (di fatto come se non avessimo mai lavorato a 16 bit), e avverrà di nuovo la posterizzazione.


Considerazioni finali

Gli esempi visti suggeriscono in definitiva che la reale utilità del lavorare a 16 bit sia durante la fase di post-produzione delle nostre immagini. Questo ci permette di fare tutte le lavorazioni necessarie senza preoccuparsi della comparsa di effetti di posterizzazione. Nella pratica, potrebbe essere difficile che durante una post produzione standard gli 8 bit portino a effetti visibili, ma nel dubbio non essendoci particolari svantaggi a lavorare a 16 bit (se non il maggiore quantitativo di memoria utilizzato) tanto vale farlo.

 

Osserviamo infine che non esiste alcune legame tra la profondità in bit e lo spazio colore in cui stiamo lavorando! Una foto a 8 bit in ProPhoto RGB può contenere (al massimo) lo stesso identico numero di colori di una foto a 8 bit in sRGB, cioè un po' più di 16 milioni. Il numero di colori rappresentabili è determinato esclusivamente dalla profondità colore utilizzata. Semplicemente, in ProPhoto RGB questi 16 milioni di colori possono "pescare" da un gamut molto più ampio.

L'unica considerazione che si può fare sul legame bit/spazio colore è che lavorando in ProPhoto RGB è praticamente d'obbligo utilizzare 16 bit, in quanto i colori rappresentati in 8 bit all'interno di uno spazio così ampio risulterebbero troppo distanziati tra loro e effetti come il banding potrebbero nascere molto facilmente. In sRGB invece, per quanto 16 bit consentano di muoversi in totale sicurezza, 8 bit dovrebbero essere più che sufficienti se non eseguiamo manipolazioni eccessive.

Partita Iva    11458010011