Una delle domande più frequenti che capita di leggere nei newsgroup e nei forum di fotografia digitale riguarda il formato RAW; tutte le reflex digitali e buona parte delle compatte evolute permettono il salvataggio in questo formato, insieme ai più comuni TIFF e JPG. E le risposte invariabilmente sono sempre le stesse: evito di riassumerle ora, perché preferisco arrivare a capire il perché il RAW, in determinati casi, sia meglio degli altri due formati, come al contrario il RAW, in altri casi, possa costiuire un ostacolo o un rallentamento.
Prima, però, è bene capire come funziona il sensore di una fotocamera digitale. Tralascerò i sensori Foveon e i dettagli sui Super CCD di Fujifilm, perché non li conosco e perchè sono meno usati dei più diffusi CCD e CMOS. Per degli esempi, mi servirò del programma dcraw, un software a linea di comando scritto in C e quindi con una portabilità massima, anche nel tempo: probabilmente quando Adobe Camera Raw non potrà più essere eseguito sui PC del futuro, sarà sempre possibile compilare il codice di dcraw.
CCD o CMOS si basano sulla capacità che alcuni materiali hanno di reagire all'esposizione alla luce, in particolare alla caratteristiche che hanno alcuni semiconduttori di far muovere cariche elettriche se colpite da fotoni. Senza addentrarmi in dettagli di fisica e di microelettronica (gli esami dell'università sono lontani), possiamo semplificare la cosa dicendo che un sensore fotografico non è altro che una matrice di punti in grado di leggere la luce e restituire, per ciascun punto, un segnale elettrico direttamente proporzionale all'intensità della luce letta: tale relazione di proporzionalità è lineare, cosa questa molto importante per quanto si vedrà più avanti.
Una cosa che forse non tutti sanno è che i sensori, presi a sé stanti, non sono sensibili ai colori. La cosa può soprendere, perché giurereste che la vostra fotocamera digitale tira fuori immagini a colori, e nella maggior parte dei casi i colori sono anche fedeli alla realtà. Eppure è così: i fotodiodi che costituiscono la matrice del sensore sentono solo l'arrivo dei fotoni, non la loro lunghezza d'onda, per cui il segnale che restituiscono è pura luminosità. Un po' come gli occhi dei gatti, le cui retine sono povere di coni, che presiediono alla percezione dei colori e dei contrasti, e ricche di bastoncelli, che invece sono molto sensibili alle variazioni di luminosità, anche piccole. Anche negli occhi umani i coni sono molti meno dei bastoncelli (in un rapporto di 1 a 50), ma nell'occhio del gatto questo rapporto è molto più basso.
Nei sensori, in pratica, i coni non ci sono affatto (o meglio nei sensori CCD o CMOS; il Foveon prende il nome proprio dalla fovea, una zona della retina priva di bastoncelli).
Come si riesce a risalire alle informazioni di colori, che come sappiamo nelle immagini digitali fanno riferimento ai tre valori R-G-B? Il sensore va ingannato; o meglio, vanno ingannati i singoli fotodiodi. Davanti a tutti i sensori CCD e CMOS (e anche Super CCD), c'è il cosidetto filtro di Bayer, che non è altro che una matrice di filtri colorati che ha un ben determinato pattern spazialmente periodico; quasta matrice ha lo stesso numero di elementi del sensore, ciascuno dei quali è perfettamente allineato ad un fotodiodo del sensore. Un pattern di Bayer potrebbe essere fatto così:

In pratica ogni diodo legge la luminosità che passa attraverso un filtro colorato, del colore assegnato dalla posizione del pattern di Bayer; poiché i tre colori primari hanno lunghezze d'onda ben distinte, sono facilmente filtrabili (il rosso filtra molto bene blu e verde, ecc...), in pratica ogni fotodiodo legge il valore di luminosità di un solo colore.

In pratica, il primo elemento ha solo informazioni sul rosso, il secondo solo sul verde, il terzo solo sul blu, il quarto solo sul verde, ecc... Come si può ben vedere il numero di elementi associati al verde è molto più alto (il doppio, praticamente) di quelli associati al blu o al rosso. Questo perché l'occhio umano è particolararmente sensibile alla lunghezza d'onda del verde. Di conseguenza il canale migliore di un'immagine proveniente da un sensore è il verde, avendo meno punti in cui tale colore deve essere interpolato.
La ricostruzione dei colori mancanti da associare in ciascun elemento sensibile (o meglio, dei livelli di riferimento per i tre componenti R-G_B) viene fatta per interpolazione coi valori dello stesso colore adiacenti, letti da altri elementi sensibili; esistono molti algoritmi di interpolazione dei colori, se proprio vi interessano qui ne trovate un certo numero, anche se in trattazione molto accademica. Questa operazione prende il nome di demosaicizzazione. L'immagine che segue dà una semplificazione (persino eccessiva) del processo di interpolazione: in effetti di norma questo processo non è una semplice media, ma involve una elaborazione di più valori adiacenti, nemmeno in forma strettamente regolare (alcuni algoritmi, detti adattivi, seguono dei "percorsi" per garantire una migliore qualità nelle transizioni ad alto contrasto),

Alla fine dei calcoli, ciascuno elemento della matrice corrispondende al sensore potrà essere caratterizzato dai tre valori R-G-B, solo uno dei quali, però, sarà stato letto dall'elemento sensibile di quella posizione; gli altri saranno ottenuti mediante interpolazione. Se non si effettuasse la demosaicizzazione, l'immagine risultante, in toni di grigio, sarebbe qualcosa simile a questa:

Questa è l'uscita del programma dcraw con lo switch -d, che dà in output esattamente i valori letti dal sensore, senza l'operazione di demosaicizzazione: l'ingrandimento del ritaglio è di 4 volte rispetto alle dimensioni originali, per cui sono molto ben visibili i pixel ed il loro diverso livello di grigio dovuto al diverso filtraggio della matrice Bayer.
C'è un altro problema: i nostri occhi, come le pellicole, hanno una sensibilità che varia con l'intensità della luce: in pratica sono tanto più sensibili a differenze di luminosità quanto più le scene osservate sono poco illuminate, mentre tendono ad non rilevare diffeenze anche notevoli quando la scena osservata è molto luminosa: questo è un comportamento tipicamente logaritmico. Questa risposta non lineare dei fotorecettori della retina permette la percezione di un vastissimo spettro di livelli di segnale. I sensori, invece, percepiscono i livelli di luminosità in maniera proporzionale all'energia che ricevono: tanto più è forte la luce che ricevono, tanto più forte sarà il segnale: in pratica, il sensore ha un comportamente lineare: ancora più in dettaglio, i sensori praticamente contano i fotoni che arrivano suoi fotoricettori e danno un segnale elettrico in uscita proporzionale a questo numero; il segnale d'uscita quindi è proporzionale all'esposizione.
Ciò significa che se questo segnale elettrico, a valle dei convertitori A/D, venisse codificato con 12 bit per rappresentare 4096 livelli, il livello 2048 rappresenterebbe la metà dei fotoni raccolti dal livello 4096. Il problema, però, è che gli occhi non percepiscono la differenza tra il livello 2048 e il livello 4096 come il doppio.
Guardando l'istogramma dei segnali catturati dal sensore dopo la codifica in 12 bit, troveremmo che il grafico è fortemente concentrato sulla sinistra, cioè sui livelli più bassi, mentre sui livelli più alti, essendo i livelli molto distribuiti, l'istogramma risulterà molto basso. Questo problema viene solitamente risolto applicando una curva correttiva, solitamente di tipo esponenziale, di questa forma:
Livello dei pixel=esposizione^(1/gamma)
gamma ha un valore pari a 2.2 per lo spazio colore sRGB ed in pratica è la variabile che lega la luminanza dei pixel.
Questo fatto ha una implicazione non esattamente trascurabile, per eventuali elaborazioni fotografiche: questa distribuzione di luci e ombre, così come viene letta dal sensore, fa sì che dei 4096 livelli disponibili con 12 bit (ad esempio), la metà di essi serve a rappresentare i toni che "accendono" il solo 12 bit, quindi le alte luci, per un totale di 2048 livelli; i rimanenti 2048 vengono "spartiti" per tutti gli altri livelli; ciò significa che per un numero di fotoni pari alla metà, saranno disponibili un numero di livelli pari alla metà. Questo implica un maggiore errore di quantizzazione nelle ombre, ed è questo che rende le ombre "rumorose" se si cerca di "aprirle", in senso fotografico. Peraltro, è a tutti noto che le esposizioni sulle fotocamere digitali è bene prenderle sulle alte luci; così facendo, si raccolgono tutte le informazioni sulle luci, certo, ma si comprimono nei pochi livelli riservati a loro, le ombre. Le implicazioni non finiscono qui, ma preferisco fermarmi per non complicare le cose...
Ancora una volta, dcraw ci viene incontro per degli esempi: con lo switch -4, dcraw permette di salvare i file raw come "linear PPM" o "linear PSD", cioè senza la correzione della curva che approssima la funzione esponenziale, che solitamente viene messa nell'intestazione del file raw, in maniera tale che il software di conversione possa aggiustare i toni: questo è l'esempio dell'output di dcraw, con e senza switch -4.

Immagine corretta con la curva (dcraw -w)

Immagine non corretta con la curva (livelli come letti e demosaicizzati dalla macchina, dcraw -w -4)
Come è evidente, l'istogramma è tutto spostato verso le ombre, nel secondo caso. Ovviamente tutto si può correggere, e la curva necessaria per correggere la "linearità" del sensore è illustrata nella figura che segue. Forse è anche meglio che non l'output di dcraw, che invece applica la curva della macchina, in quanto le luci e le ombre sono regolate da chi ha scattato la foto, e non da uno stupido software. La curva è una approssimazione di una curva del tipo Y=K*x^(1/gamma) con gamma>1.

E poi, dopo demosaicizzazione e adattamento ai mezzi analogici (monitor, stampanti ed occhi), un file raw andrebbe adattato ai parametri di scatto, in termini di bilanciamento del bianco, nitidezza, saturazione dei colori, e quant'altro una fotocamera può contenere.
La differenza tra un file raw e un file jpg generato da una fotocamera digitale sta proprio qui: un file raw è esattamente quanto il sensore ha letto, con l'aggiunta di una ricca intestazione che memorizza la curva di correzione e altri parametri utili alla ricostruzione del file, demandando queste complesse operazioni ad un pc con l'adeguato software di conversione; per il jpg, tutte queste impostazioni devono essere utilizzate, al momento dello scatto, per generare immagini demosaicizzate, corrette in termini di gamma, correttamente rese nitide da algoritmi di maschere di contrasto, applicato il giusto profilo colore e applicata la giusta saturazione, convertita a 8 bit/colore (downsampling), compressa con l'algoritmo DTC e...
Insomma, il firmware della fotocamere dovrebbe fare un bel po' di cose, tutte insieme e possibilmente velocemente. Per quanto buoni siano i moderni processori di immagini (ad esempio il DIGIC II di Canon), non saranno mai flessibili come il software che gira un processore di un PC.
Oltre al fatto che ciò che produce le immagini JPG (al di là della compressione) sarà sicuramente meno flessibile, sulle immagini jpg, meno ricche di informazioni, non si potranno più apportare modifiche senza danneggiare ulteriormente le immagini; col file raw, invece, tali modifiche potranno essere applicate semplicemente come si farebbe sulla fotocamere prima dello scatto, solo che comodamente seduti davanti ad un pc e dopo aver scattato.
© Maurizio Firmani 2004-05 - Hosting Computerville di Mario Benvenuti