NOTA! Questo sito utilizza i cookie e tecnologie simili.

Se non si modificano le impostazioni del browser, l'utente accetta. Per saperne di piu'

Approvo

Teoria della CG: Luminosità vs Gamma Correction

 

In questo tutorial metteremo a confronto l'utilizzo dello strumento di variazione di luminosità di base e l'operatore Gamma per rendere più o meno luminose delle immagini. La variazione di luminosità è un'operazione abbastanza intuitiva, mentre per la correzione Gamma dobbiamo spendere qualche parola...

 

 

 

 

Detto in maniera "brutale", il Gamma è un valore numerico (per la precisione, un coefficiente), ed in particolare si ha che un valore in output è dato dall'input elevato al valore Gamma; questa è, in generale, la regola più adottata, ma alcuni sistemi considerano come esponente dell'input la frazione 1/Gamma, per cui fate attenzione a qual è la convenzione adottata dal vostro sistema.

 

 

La correzione Gamma è stata introdotta principalmente per risolvere alcuni problemi dei vecchi monitor CRT (tubo a raggi catodici) ma viene utilizzata anche per la conversione di immagini dall'analogico al digitale, o comunque che devono essere visualizzate o proiettate su sistemi diversi (ad esempio, schermi LCD o stampanti).

 

 

Il valore Gamma è utilizzato anche come misura del contrasto offerto dalle pellicole fotografiche (in generale, è un indice della risposta di un segnale rispetto all'input); la codifica e la decodifica del Gamma vengono utilizzate anche in fase di salvataggio e apertura delle immagini digitali e, a seconda delle piattaforme hardware e software, i valori dei coefficienti possono variare sensibilmente.

 

 

Nel nostro caso, lo utilizzeremo – in maniera molto, molto banale – per rendere più o meno luminosa un'immagine; in particolare, utilizzeremo il Nodes Editor di Blender 3D 2.5, per vedere quali strumenti ci offre il programma per questo scopo.

 

 

La correzione Gamma è un'operazione non lineare, profondamente diversa dalla somma o dalla moltiplicazione, che sono operazioni lineari; l'immagine seguente serve a comprendere meglio la differenza: il grafico mostra, sull'asse X, i valori “originali” di un pixel, mentre sull'asse Y abbiamo i valori in uscita dopo aver effettuato l'operazione.

 

 

La scala dei valori è 0.0 (nero puro) – 1.0 (bianco puro), qualora alcuni valori dovessero superare questi estremi, in negativo o in positivo, verranno troncati a 0 o 1.

 

 

Nel primo grafico, che mostra l'immagine originale senza alcuna operazione applicata, l'output è identico all'input, quindi la curva di trasformazione dei valori è una retta.

 

 

Nel secondo grafico, applichiamo +0.5 (con un'operazione di somma, quindi) ai valori in input: notiamo che abbiamo spostato in alto la curva, perdendo il nero assoluto (perché qualsiasi pixel a 0.0 partirà da 0.5, e così via) e abbiamo portato a bianchi molti pixel, ed in particolare tutti quelli che avevano un valore maggiore uguale a 0.5, e questo perché la scala dei valori è 0.0-1.0, con 1.0 che rappresenta il bianco puro.

 

 

Nel terzo grafico, moltiplichiamo i valori originali per 1.5: questa volta il nero puro resta tale, visto che 0 per un fattore moltiplicativo fa 0, ma ancora una volta corriamo il rischio di portare a bianco puro certi pixel e, di conseguenza, di perdere delle informazioni sull'immagine originale.

 

 

Il quarto grafico mostra l'effetto dell'operatore Gamma con valore 0.6 secondo la convenzione input elevato a Gamma: la trasformazione è una curva che congiunge il nero puro e il bianco puro aumentando tutti gli altri valori ma mantenendoli nel range originale.

 

 

Il nero puro resta tale e così anche il bianco, mentre tutti gli altri colori risultano più luminosi in maniera “naturale”, nessun pixel nel range intermedio tra nero e bianco viene “troncato” a uno dei due valori, evitando tra l'altro la perdita di informazioni.

 

 

Per utilizzare la Gamma Correction in Blender, è sufficiente aggiungere un Nodo di tipo Color-Gamma, passare un'immagine sulla socket di input e prelevarla su quella di uscita e specificare un valore di correzione Gamma all'interno del Nodo; Blender utilizza la convenzione input elevato a Gamma per effettuare la conversione, con valori di input espressi nel range 0.0-1.0, quindi con valori maggiori di 1 per Gamma avremo immagini più scure, mentre con valori minori di 1 avremo immagini più chiare (ad esempio, con Gamma 0.7 un pixel con valore di input 0.5 assumerà valore di output 0.61).

 

 

Il Nodes Editor dell'esempio mostra, mediante gli istogrammi, la perdita di informazione dovuta ad una semplice addizione, ottenuta mediante il Nodo Brightness/Contrast, ossia Contrasto e Luminosità, con un fattore additivo per la luminosità: i pixel scuri, al di sotto di una certa soglia, sono andati semplicemente perduti, mentre Gamma li mantiene ancora, com'è possibile verificare osservando l'istogramma in arrivo dal Nodo Gamma, in basso.

 

Teoria della CG: operazioni di post-processing sulle immagini e perdita di informazioni

 

Questo è un tutorial teorico che tratta un problema che può presentarsi in fase di post-produzione: la perdita di informazione dovuta ad operazioni che in linea di principio sono reversibili ma che, in pratica, non si comportano proprio così...

 

 

 

 

Il “colore” di un pixel, o comunque il valore di intensità (per immagini in scala di grigi), è memorizzato nel computer mediante numeri che possono variare in un determinato range, ad esempio 0-255 per canale colore in formati a 8 bit.

 

Le operazioni di post-produzione cambiano tali valori mediante operazioni matematiche; quando, ad esempio, raddoppiamo la luminosità, stiamo moltiplicando i valori originali per ottenere un nuovo risultato.

 

 

Il problema è che queste operazioni possono modificare le informazioni in modo tale da non poter tornare indietro, ossia da non poter recuperare l'immagine originale applicando un'operazione inversa... vediamo alcuni esempi.

 

 

Se aggiungiamo ad un'immagine il colore grigio puro, rappresentato dai valori 0.5 per tutti e tre i canali RGB nel range 0.0 – 1.0, tendiamo a rendere più chiara l'immagine; tuttavia, i pixel dell'immagine originale che avevano valori maggiori di 0.5 per uno o più canali si ritroveranno con il valore “troncato”, per così dire, a 1.0, che è il massimo della scala e che rappresenta il bianco puro.

 

 

Provando ad applicare successivamente una sottrazione di 0.5, non torneremo all'immagine di partenza: prendendo ad esempio un pixel a 0.8 e sommandogli 0.5, memorizzeremo 1.0 anziché 1.3 perché il massimo della scala è 1.0, dopodiché togliendogli 0.5 arriveremo appunto a 0.5, non più lo 0.8 iniziale.

 

 

Considerazioni analoghe possono essere fatte per la sottrazione che viene troncata a 0.0, che rappresenta il nero puro, non ammettendo valori negativi; in questo caso, partendo ad esempio da 0.3 e sottraendogli 0.5 arriveremo a 0.0, dopodiché sommandogli 0.5 arriveremo a 0.5, che è un valore maggiore (e, quindi, “più luminoso”, in un certo senso) di quello di partenza!

 

 

Il discorso può essere esteso a tutti gli operatori matematici, quindi anche a moltiplicazione e divisione, e ad intere espressioni che rappresentano, in effetti, particolari operatori di compositing.

 

 

Altro esempio: la variazione del contrasto.

 

 

Partiamo sempre dall'immagine originale...

 

 

...dopodiché dividiamo il contasto per due per ottenere una prima immagine intermedia...

 

 

...quindi prendiamo questa immagine e moltiplichiamo il contrasto per 2:

 

 

ancora una volta, l'output è diverso dall'immagine originale, e questo perché i valori fuori scala sono stati tagliati, ed anzi a seconda della precisione numerica adottata dal software utilizzato possiamo aver perso dei valori nel range standard per motivi di arrotondamento nelle moltiplicazioni in virgola mobile (ad esempio se il software memorizza solo una cifra decimale, dividendo 1.5 per due otterremo 0.75, arrotondato quindi a 0.8 dal software, moltiplicandolo poi per due otterremo 1.6, che chiaramente non è 1.5... peggio ancora se si lavora solo con numeri interi, ad esempio nel range 0-255 senza decimali).

 

 

La differenza può essere quasi impercettibile, ma c'è, come mostrato dall'immagine seguente, dove sono presenti gli istogrammi dell'immagine originale e quello dell'immagine finale, ottenuta dopo la moltiplicazione per due.

 

 

Questi esempi sono davvero banali, potreste obiettare che non ha molto senso dividere e poi ri-moltiplicare un'immagine in questo modo... in effetti, non penso vi capiterà mai di applicare questi passaggi DI SEGUITO, ma in un processo di compositing medio-lungo, dove possono esserci anche maschere ed altri elementi da integrare in una singola scena, può capitare, per cui è bene sapere qualche elemento di teoria, un po' di “dietro le quinte” di queste operazioni.

 

 

Possibili rimedi sono ad esempio l'utilizzo di software non banali (ossia che memorizzino i valori fuori scala nei passi intermedi e almeno due cifre dopo la virgola), l'utilizzo di formati di immagine con una profondità dei dati maggiore, come ad esempio EXR (utilizzato soprattutto per le immagini in HDR ma che può tornare molto utile anche in post-processing con immagini “standard”) oppure soluzioni ad hoc a seconda del tipo di problema; ad esempio, per rendere più luminosa un'immagine potremmo utilizzare l'operatore Gamma anziché la luminosità con addizione o moltiplicazione... ma di quest'ultimo argomento parleremo in un altro tutorial ad hoc.

 

 

C'è da dire inoltre che i programmi utilizzano spesso rappresentazioni interne che “sforano” i limiti di 1.0 e 0.0, memorizzando anche i valori fuori scala nei passi intermedi di post-processing, per cui se ad esempio elaborate la sequenza Somma 0.5 e Sottrai 0.5 nel Nodes Editor di Blender non noterete questo problema, perché Blender memorizzerà anche i valori fuori scala, ma se il software da voi utilizzato non dovesse presentare questa caratteristica o se doveste salvare su singoli file i passi intermedi ed elaborarli successivamente, come ho fatto io per ottenere le varie immagini mostrate finora, allora lì si avrà quanto detto.

 

Sottocategorie

 
Vai all'inizio della pagina