mercoledì 24 agosto 2011

Ma le fotocamere vedono a colori?

Canon EOS 5D MKII - EF 24-105 F4L @ ISO 200

Risposta: si é ovvio, che domande fai? Zillioni di fotografie a colori e non sei ancora convinto che le fotocamere vedano i colori? Giusto certo. É evidente, le fotocamere vedono i colori. Dovevo porre la domanda in modo diverso: I sensori vedono i colori?


Risposta: No.


Come no? Se le fotocamere vedono i colori anche i sensori lo fanno. É ovvio. Beh mica tanto.


I sensori, sia i CCD che i CMOS, sono dei dispositivi elettronici composti da un elevatissimo numero di fotodiodi che producono una tensione elettrica quando vengono colpiti dai fotoni che compongono la luce da cui sono illuminati.


Più luce, più fotoni, più tensione.


Un dispositivo detto convertitore Analogico/Digitale prende il segnale analogico (la tensione) in uscita dal sensore e lo converte in un numero. Questo numero rappresenta l'intensità luminosa della luce ricevuta. In una conversione a 8 bit, 0 é nero, 255 bianco, in mezzo grigio.


Cosa c'entra il colore della luce con tutto questo? Nulla. l'intensità misurata é la stessa indipendentemente dal colore della luce incidente. Viene registrata un'unica informazione, l'intensità. Non la frequenza e, quindi, non il colore.


Ma allora?


Beh, ovviamente c'é il trucco. Tutti sappiamo cosa succede se facciamo passare un raggio di luce bianca attraverso un prisma di vetro ottico: La copertina di "The dark side of the moon". Ovvero i raggi luminosi possono essere scomposti nelle loro componenti colorate. É vero anche il viceversa e ormai tutti sappiamo che esistono dei colori primari che, mescolati opportunamente, ci permettono di ottenere qualsiasi colore vogliamo.


Questi sono il Rosso, il Verde ed il Blu.

Il filtro di bayer


Se facciamo passare un raggio di luce colorata attraverso un vetro rosso, solo la sua componente rossa lo attraverserà. Idem per vetri  verdi e blu.


Il filtro di Bayer. Notate come il verde compaia all'incirca il doppio di rosso e blu




L'idea che ebbe un certo signor Bayer fu di anteporre al sensore una lastrina di vetro colorata, dove davanti a ogni fotodiodo del sensore si trovasse un vetrino di colore diverso. Rosso, Verde o Blu. Quindi un fotodiodo posto sotto  il vetrino rosso registra solo la parte rossa della luce incidente e così via per quelli sotto il vetro verde o blu.


In figura si può vedere un esempio di questo filtro per un ipotetico sensore con 10x13 pixel. Già perché ognuno di questi fotodiodi é proprio un pixel del nostro sensore, proprio quelli che contano tanto nelle brochure pubblicitarie delle nostre agognate fotocamere. É interessante notare come in un sensore i pixel che vedono il verde sono il doppio di quelli che vedono il rosso o il blu.


Detto chiaro, una macchina con 12 MegaPixel ne vede 6 verdi, 3 rossi e 3 blu. Le componenti cromatiche che mancano a ciascun pixel vengono ricostruite matematicamente a partire dai pixel vicini.


Per vedere come si ottiene un'immagine a colori da un sensore che vede solo in bianco e nero con anteposto questo filtro, che chiameremo di Bayer, la cosa migliore é un bell'esempio.

Un esempio



Supponiamo che il nostro sensore, dall'altissima risoluzione di 0.00013 mega pixel, venga usato per riprendere la bandiera italiana rappresentata in figura.


Il nostro soggetto di esempio

Ora sovrapponiamo il filtro di Bayer all'immagine. Vediamo cioè l'immagine come la vede il sensore. E la cosa si fa già interessante. Come vedete la parte rossa della bandiera ha solo tre pixel illuminati, quella verde ben nove. Il bianco li ha tutti. Il rosso é stato particolarmente sfortunato. La parte rossa della bandiera ricopre un'area con solo tre pixel sensibili al rosso.

Immaginate di essere il sensore, state osservando il soggetto attraverso il filtro e così è come vedete la bandiera



Ora però abbiamo detto che il sensore registra solo le luminosità assegnando a ogni pixel un valore tra 0 e 255 ( nella nostra conversione a 8 bit ). Quindi il sensore vede la nostra bella bandiera colorata come nell'immagine sottostante.

O meglio, la vedete così, ricordate che il sensore vede solo la luminosità. Per comodità ho riportato in ogni casella il valore di luminosità rilevato.



Eh eh visto che dopotutto la fotocamera vede in bianco e nero?

La demosaicizzazione



Il procedimento che ci permette di calcolare le componenti cromatiche RGB di ciascun pixel dalla conoscenza dei soli valori di luminosità e della geometria del filtro é noto come demosaicizzazione.


Per comodità, in figura, sono riportati i valori di luminosità registrati per i singoli pixel abbinati al colore del rispettivo filtro. Li useremo, insieme con un semplice algoritmo di demosaicizzazione per ricostruire la nostra immagine a colori.


La matrice del filtro con le luminosità rilevate.


L'algoritmo



Il succo di un algoritmo di demosaicizzazione risiede nel fatto che é ragionevole presupporre che il colore di un pixel sia fortemente legato a quello dei pixel adiacenti. Questo é sicuramente vero nelle aree con campitura uniforme, ad esempio il petalo di un fiore; é meno evidente e più problematico vicino al bordo di una figura o con figure aventi trame molto fitte.


In sostanza comunque quello che si fa é, per ogni pixel, determinare le componenti mancanti ricavandole da quelle presenti nei pixel adiacenti.


É possibile inventarsi ogni sorta di algoritmo matematico per calcolare le componenti che ci servono, e nel tempo le case produttrici di sensori hanno investito molto tempo e denaro nel migliorare la matematica e gli algoritmi atti a questo scopo. Una semplice ricerca in letteratura mostra decine di pubblicazioni sull'argomento.


Noi useremo l'algoritmo più semplice che possiamo trovare, e che tutti hanno avuto modo di conoscere e usare in vita loro.  La media aritmetica.


Molto semplicemente, per ogni pixel ricaveremo i valori dei canali Rosso, Verde e Blu dalla media aritmetica dei valori misurati dai pixel immediatamente adiacenti del colore primario che ci interessa. Con un'unica avvertenza: terremo per buono, senza mediarlo, il valore del canale misurato per il colore del pixel che stiamo valutando.


In altri termini, se il pixel che stiamo valutando é uno di quelli "rossi", con valore di luminosità ad esempio di 127, per il canale Rosso terremo buono il valore di 127, senza guardare quelli adiacenti.


I valori calcolati come esempio per alcune caselle



Nell'immagine sovrastante abbiamo ricavato come esempio i valori della terna RGB per una manciata di pixel. Giusto come esempio calcoliamo i valori per un paio di questi, in particolare per i pixel della riga 3, colonne 2 e 3.


Riga 3 colonna 2. É un pixel rosso, il cui valore é 127. i pixel verdi adiacenti sono 4, tutti con valore 127. La media per il verde sarà quindi 127. I pixel blu sono 4, di cui tre con valore 127 e uno con valore 0. La media sarà quindi 95.2, che arrotondiamo a 95 dato che solo valori interi sono ammessi.


Ricapitolando abbiamo: R: 127; G: 127; B: 95


É un grigio sporco, un po' diverso da quello nell' immagine di partenza che era un grigio medio con tutti e tre i valori a 127.


Riga 3 colonna 3. É un pixel verde, il cui valore é 127. I pixel rossi adiacenti sono 2, uno con valore 127 l'altro 0. La media per il rosso sarà quindi 63. I pixel blu sono 2, anche loro con valori 127 e 0. La media per il blu sarà 63.


Ricapitolando abbiamo: R: 63; G: 127; B: 63


Questo é un verde un po' spento. Non il bel verde della bandiera, ma comunque un verde.


Notiamo come entrambi i pixel, nell'immagine con i soli livelli di luminanza siano stati misurati come grigio medio a valore 127. L'informazione sul colore deriva dalla conoscenza della geometria del filtro di Bayer e da nient'altro.



Proseguendo con l'esercizio otterremmo infine l'immagine riportata sotto.


L'immagine demosaicizzata. Sorpresa, non molte caselle hanno mantenuto il colore originale



L'immagine demosaicizzata, pur rispecchiando l'originale, presenta molti pixel con falsi colori nonché una notevole perdita di "dettaglio" dovuta al fatto che i colori debordano gli uni sugli altri rendendone sfumati i contorni. Questo, insieme ad altre simpatiche conseguenze, é proprio quello che succede con immagini reali. Questa perdita di dettaglio é ad esempio uno dei motivi per cui necessitiamo sempre di applicare una maschera di contrasto all'immagine digitale per "recuperare" la nitidezza.


Tenete comunque conto che su una stampa, un dettaglio di 13x10 pixel é veramente minuscolo (0.7 x 0.5 mm per un file di una 5d MK II stampato su un foglio 20 x 30 cm), ma se ingrandirete sufficientemente i vostri scatti, quando noterete degli artefatti del genere, non date la colpa all'ottica!


Abbiamo certamente scelto l'algoritmo più semplice a scopo didattico, algoritmi più complessi portano a risultati migliori, ma non potremo mai del tutto ovviare ai problemi che la demosaicizzazione porta con se, per così dire, da progetto, quali una certa perdita di definizione e di fedeltà cromatica.


Ci sarebbero molte cose da aggiungere a questo discorso, che purtroppo peró é diventato fin troppo lungo. L'unica cosa che é doveroso spiegare é il perché nel filtro di Bayer il verde abbia un peso doppio rispetto agli altri. Semplice, é il colore che i nostri occhi vedono meglio e su cui notano maggiormente le differenze tonali. In fondo ci siamo evoluti per distinguere prede e predatori in mezzo alla vegetazione.