Home > Tecnica > A proposito di NEF compresso...

A proposito del NEF compresso...

Sarà lossless o no?

Diciamolo subito e togliamoci il pensiero: gli effetti della compressione che Nikon ha implementato sul suo formato RAW (chiamato NEF, Nikon Electronic Format) non sono percepibili ad occhio nudo. Non lo sono per chi altera abbastanza pesantemente le foto con programmi di fotoritocco, tanto meno lo sono per chi le immagini le visualizza a schermo o le stampa con minimi aggiustamenti partendo dal formato raw. Eppure tale compressione comporta una perdita delle informazioni disponibili dal sensore.

Quello di cui vorrei parlare qui non è tanto la visibilità o meno della perdita dovuta a questa compressione, percepibile dai più solo strumentalmente sapendo cosa, come e dove cercare, quanto piuttosto tentare di spiegare il perché della scelta di questo formato da parte dei progettisti, prendendo quello che si trova in rete. C'è da sapere, infatti, che del formato di compressione proprietario Nikon non sono disponibili specifiche ufficiali: le informazioni che sono state diffuse sono frutto di reverse engineering da parte di volenterosi e appassionati, esperti anche di codice C.

In questo sito (in inglese), infatti, viene spiegato come avviene questa compressione e cosa comporti in termini di bit; le informazioni sono state ricavate interpretando il codice del software DCRAW, il programma di conversione raw open source di David Coffin: l'autore di questo software ha eseguito una sorta di reverse engineering sui formati raw dei vari produttori di fotocamere, non solo Nikon, creando un codice in grado di generare delle immagini bitmap RGB in formato .ppm a 8 bit/colore, oppure .ppm o .psd a 16 bit/colore (per questi ultimi due formati, con qualche limitazione); le immagini che escono da questo software, pur mancando le regolazioni classiche dei software di conversione proprietari, sono di eccellente qualità. Pregevole, inoltre, la funzionalità di generare immagini tali e quali il sensore le ha generate, senza l'interpolazione dei colori (demosaicizzazione o debayerizzazione), ottenibile mediante lo switch "-d".

Come funziona (o meglio come si suppone funzioni) la compressione dei NEF.

Il formato NEF compresso è disponibile come opzione nelle reflex digitali Nikon D100, D200, D2x, D2h, mentre è l'unico formato raw disponibile per D70, D70s e D50. Limitiamoci al sensore della D70 (per le altre il discorso è del tutto analogo): questa fotocamera ha un convertitore analogico-digitale (ADC) a 12 bit, che digitalizza (campiona e quantizza) il segnale che esce dal sensore CCD Sony ICX413AQ (per la D70). In teoria un sensore a 12 bit/pixel dovrebbe garantire 2^12=4096 possibili valori (o livelli). La conversione al formato NEF compresso riduce questi 4096 valori a soli 683 livelli, applicando una curva di quantizzazione: dopodiché i valori sono codificati usando un numero variabile di bit (da 1 a 10) con una struttura ad albero molto simile allo schema di compressione Huffman o Lempel-Ziv (quelli usati da software come winzip o winrar), tipicamente lossless.

La perdita di informazione non avviene nella compressione secondo questi schemi (che sono lossless), bensì nell'applicazione della curva di quantizzazione: chi è pratico di telefonia potrà capire meglio questo processo pensando all'applicazione delle curve A-law o mu-law che permetto la riduzione da 12 a 8 bit/campione nei segnali PCM che codificano la voce nella telefonia tradizionale: questa tecnica permette di guadagnare spazio in banda, riducendo il numero di bit da trasmettere grazie alla compressione della dinamica laddove si possa ridurre senza perdite significative: in particolare, le curve A-law e mu-law riducono il numero di bit di campionamento comprimento il segnale e digitalizzandolo con meno bit, per poi eseguire la funzione inversa, espandendolo (il sistema che fa ciò prende il nome di COMPANDER).

La curva di quantizzazione utilizzata viene memorizzata all'interno del file NEF, ed esattamente nella sua intestazione, il che permette eventuali modifiche di firmware senza dover modificare i software di conversione: ogni file, qualunque sia la versione firmware della fotocamera che l'ha generata, si porta dietro tutto quello che serve per la sua decodifica.

La curva di quantizzazione converte i 12 bit di informazione generati dal sensore in una risoluzione in toni pari a log2(683)=9.4 circa. La gamma dinamica non cambia. Fazal Majid ha modificato il codice di dcraw in maniera tale da mandare in output su file la curva dei livelli, realizzata come coppia livello di ingresso-livello di uscita, il che la rende terribilmente simile ad una curva di gamma. Mi sono permesso di convertire il file .csv presente nel sito sopra indicato, in un più comodo file .xls da cui è più facile ricavare i grafici. Di seguito il grafico della curva di quantizzazione, cioé di come vengono mappati i 4096 livelli di uscita del sensore nei 683 livelli del NEF compresso.

Come si può vedere dal file, per i primi 215 livelli c'è un andamento lineare; al di sopra di questo livello, l'andamento prende una forma logaritmica, e ciascuno dei livelli da 216 a 682 rappresenta più di un livello effettivo: ad esempio, il livello di uscita 216 in effetti rappresenta sia il lvello 216 che il 217, il 444 rappresenta i livelli da 1304 a 1312, e via crescendo, man mano che ci si sposta verso i livelli più alti (alte luci): il livello 682 rappresenta tutti i livelli tra 4086 a 4095. Qui avviene la compressione. In effetti, quindi, al livello di immagine pre demosaicizzazione c'è una perdita di un notevole numero di livelli, è come se sui toni più chiari ci fosse una perdita di dettagli. Ma non è esattamente così (come invece sostiene Fazal Majid nel suo sito), per due buoni motivi.

Il primo motivo è che questa compressione viene fatta sull'immagine così come è letta dal sensore dietro la matrice Bayer (vedi qui per maggiori dettagli): l'algoritmo di demosaicizzazione "spalmerà" (termine non molto scientifico, ma rende l'idea) la quantizzazione "allargata" su più pixel adiacenti, rendendola piuttosto complicata da identificare.

Il secondo motivo, invece, sta nel modo in cui i sensori "vedono la luce", come ho già illustrato per sommi capi nella pagina "Formato Raw e sensori"; in pratica, per rendere la visione del sensore compatibile coi monitor e quindi con gli occhi dei fruitori dell'immagine, deve essere applicata una curva di gamma che "aggiusti" la distribuzione dei toni: questa curva "comprime" i toni più chiari e espande i toni più scuri dell'immagine, provocando su questi ultimi l'aumento dell'errore di quantizzazione, percepibile come disturbo nelle ombre. Nikon ha fatto una scelta saggia, scegliendo di non alterare ulteriormente le ombre e comprimendo invece i toni chiari; o meglio, ha fatto la scelta che provocasse il minor numero di danni.

Facciamo qualche prova

Sfruttando proprio la simpatica opzione "-d" di dcraw, generiamo due immagini a 16 bit lineari (senza cioé applicare la curva di gamma, opzione -3 o -4) non demosaicizzate, partendo da un file NEF di una D100 (non compresso) e dallo stesso risalvato come "Compressed NEF" mediante Nikon Capture.

Sovrapponendo, con GIMP, le due immagini in modo da averle su due livelli fusi tra loro con metodo "Differenza", si ottiene un istogramma (logaritmico per esaltare le differenze: un istogramma lineare non mostrerebbe un granché oltre una linea molto alta intorno al livello 0) così fatto:

Come si vede la differenza tra le due immagini ha un istogramma più concentrato sul livello 0 (pixel dello stesso valore di livello di grigio): praticamente il 99,9% dei pixel ha una differenza inferiore a 6 livelli: selezionando il livello 255 come secondo punto di conteggio si ottiene una deviazione standard dei livelli pari a 1,6. Il che significa che l'errore è trascurabile. Volendo ulteriormente indagare su quali toni si concentra questo errore, salviamo la differenza come immagine a se stante dopo aver fuso i livelli, e sovrapponiamola all'immagine compressa (stavolta con Photoshop) utilizzando il metodo di fusione Overlay, che permette di usare il livello differenza come "maschera", che fa passare i toni del livello sottostante solo se il tono del corrispondente pixel della maschera è diverso dal nero: è come se per ogni pixel il livello ottenuto dalla differenza facesse da filtro neutro, con un grigio tanto più chiaro quanto maggiore è tale differenza. Così facendo si ottengono pixel non neri solo laddove c'è una differenza diversa da zero. Vediamo in quali zone dell'immagine sono concentrati questi errori:

Immagine ottenuta dal NEF non compresso dal comando "dcraw -d" e convertita in TIFF

Immagine ottenuta sovrapponendo con metodo Overlay il NEF compresso con la differenza tra NEF compresso e non compresso

Come si può ben vedere, le differenze più forti sono concentrate nelle zone delle alte luci, e la differenza si attenua man mano che si scende verso i toni più scuri; guardate ad esempio il pezzo di muro a mattoni vicino alla finestra: nella parte bassa del muro, più chiaro, l'errore è presente e visibile nell'immagine Overlay; man mano che si sale, il muro va in una zona d'ombra e nell'immagine Overlay l'errore sparisce.

Conclusioni

Avevo già premesso che l'errore c'è ma non si vede, e che per evidenziarlo bisogna ricorrere a trucchi che per gli usi normali delle immagini digitali solitamente non si usano. Però c'è una cosa da dire a riguardo del formato compresso del NEF: l'impossibilità, sulla D70 e sulla D50, di scegliere se salvare compressi o meno i file in formato NEF, formato che dovrebbe dare il massimo della qualità, è una cosa che getta un'ombra fastidiosa su questa scelta da parte di Nikon. Se è vero che il NEF compresso è nato per velocizzare il salvataggio dell'immagine e risparmiare spazio sulle memorie, dovrebbe essere lasciata come opportunità, e non come unica scelta possibile.


© Maurizio Firmani 2004-06 - Hosting Computerville di Mario Benvenuti