Un nuovo approccio sperimentale alla maschera di contrasto con alto raggio e bassa intensità (o maschera di contrasto inversa).
Come separare la maschera di contrasto per bordi e texture nella stessa gamma di frequenze.
Scomposizione piramidale gaussiana, bilaterale e mista come piattaforma per sviluppare nuove strategie per la maschera di contrasto. 

 

di Davide Barranca

1. Introduzione

Questo articolo è una raccolta di note personali, un work-in-progress sul tema della maschera di contrasto (sharpening, o unsharp mask). Sebbene per formazione preferisco trovare risposte pratiche all’interno di Photoshop, non mi dispiace l’approccio teorico: probabilmente non sarò rigoroso, ma il mio scopo è quello di capire meglio il soggetto e condividere le mie esperienze con chi voglia integrarle o semplicemente commentare le tecniche esposte. Farò un uso estremamente semplice della matematica (limitatamente all’algebra), ma chi volesse saltare formule e grafici per passare subito alle parti più pratiche non avrà la mia disapprovazione; spero comunque che tutto possa servire per stimolare le proprie personali ricerche.

Quello che vorrei suggerire con questo articolo è, tra l’altro, un metodo per modulare lo sharpening sui diversi elementi di un’immagine (anche se appartenenti allo stesso range di frequenze) e un nuovo approccio alla maschera di contrasto inversa (alto raggio, bassa quantità). Inoltre approfondirò la scomposizione piramidale (gaussiana, bilaterale e mista) per dimostrare come sia un ottimo punto di partenza per costruire le proprie strategie di sharpening.

01-01

(Fig. 1.1) Immagine originale e una versione ricavata applicando alcune delle tecniche esposte in questo articolo.

2. Sharpening Gaussiano

Per cominciare vorrei ribadire un fatto probabilmente noto, cioè che la maschera di contrasto in Photoshop si chiama UnSharp Mask (USM): “unsharp”, cioè “non nitida”, perché assume una sottrazione tra l’immagine originale ed una sua versione sfocata. Userò spesso le sottrazioni, per cui penso sia utile un piccolo ripasso che spieghi meglio perché sfocatura e nitidezza siano parenti stretti.

In tutto l’articolo verranno usate immagini in scala di grigio: eliminare il colore è solo uno stratagemma per concentrare l’attenzione sul contrasto, senza altre distrazioni: per riportare l’effetto su immagini a colori è possibile convertire in Lab e usare il canale della Luminosità, oppure estrarre da RGB o CMYK la luminosità con un livello riempito di bianco (o nero) in modalità di fusione Colore. La prima immagine (per la quale ringrazio l’amico e fotografo Roberto Bigano), è l’originale; a seguire la versione sfocata e la sottrazione:

notes_on_sharpening_02-01

(Fig. 2.1) Immagine originale: versione in scala di grigio del dipinto di Paolo de Matteis “Le sante Maria, Maddalena e Dorotea” (particolare) Galleria Nazionale di Cosenza, Italia (Fotografia © Roberto Bigano).

notes_on_sharpening_02-02

(Fig. 2.2) Immagine originale, versione sfocata e risultato della sottrazione.

 

Aggiungendo il risultato della sottrazione all’originale si ottiene la versione più nitida:

notes_on_sharpening_02-03

(Fig. 2.3) L’immagine originale più il risultato della differenza in Fig. 2.2 danno la maschera di contrasto

In Photoshop l’effetto si ottiene con Spostamento e Scala (offset e scaling), e il risultato della differenza è forse più familiare:

notes_on_sharpening_02-04

(Fig 2.4) Usando una versione scalata della differenza in Photoshop.

notes_on_sharpening_02-05

(Fig 2.5) Dettagli della versione con maschera di contrasto usando la Sfocatura Gaussiana con raggio 4.0.

Un modo un po’ più astratto di descrivere lo Sharpening Gaussiano, che trovo utile per visualizzare l’effetto e comparare diverse strategie è disegnare l’intensità del segnale (in nero), la sua versione sfocata (in rosso), la differenza (in verde) e l’originale più la differenza (in nero grassetto):

notes_on_sharpening_02-06

(Fig 2.6) Grafico dello Sharpening Gaussiano

 

Il concetto chiave dello Sharpening Gaussiano è che la differenza tra ciò che è sfocato e l’originale è esattamente quello che sarà poi evidenziato, più pronunciato. Se si userà un kernel di sfocatura (per esempio Gaussiana, GB che sta per Gaussian Blur) che sfoca sia bordi che texture, allora proprio bordi e texture saranno più evidenti quando la differenza sarà aggiunta all’originale. A seconda dell’algoritmo usato e da come sia eventualmente processata l’immagine sfocata, si può arrivare ad uno sharpening che agisca separatamente sui vari elementi dell’immagine.

Prima di continuare, rivediamo come usare il comando Calcoli di Photoshop e come usarlo per applicare la maschera di contrasto. Apriamo un’immagine, convertiamola in Scala di Grigio (quella che preferiamo), e poi:

duplichiamo il canale del Grigio due volte;
chiamiamo il primo ORIG e il secondo BLUR;
applichiamo il filtro Sfocatura Gaussiana a BLUR;
nel menù Immagine, Calcoli per applicare la sottrazione:
ORIG – BLUR; (Eq. 2.1)
Occorre impostare la finestra Calcoli come segue:

 

notes_on_sharpening_02-07

(Fig 2.7) Finestra di Immagine – Calcoli

Attenzione, il primo termine della sottrazione è la sorgente #2, il secondo la sorgente #1. Il risultato non è riproporzionato, e per applicarlo con la giusta modalità di fusione (Luce Lineare, LL) ci sono due diverse possibilità. Chiamiamo SS1 la Sottrazione con Scala = 1, che implica una successiva applicazione del livello sull’originale con fusione LL e opacità al 50%, e SS2 la Sottrazione con Scala = 2, che implica una successiva applicazione del livello sull’originale con fusione LL e opacità al 100%. Entrambi i casi possono essere utili, come vedremo.

notes_on_sharpening_02-08

(Fig 2.8) Riproporzionare o meno la sottrazione (il risultato della sottrazione è diviso per la Scala e addizionato a Sposta

Ad un esame più attento, ho verificato che SS1 (con LL 50%) ed SS2 (con LL 100%) non sono esattamente equivalenti! Il problema è visibile, in pratica, solo quando li useremo per le scomposizioni piramidali – ed SS2, seguita da LL 50% è la strada corretta, mentre SS1 può produrre neri sbiaditi.

3. Differenza di Gaussiane

Spostiamo leggermente il punto di vista: cosa accadrebbe se, invece di sottrarre una versione sfocata all’originale, la sottrazione fosse tra due versioni diversamente sfocate? Disegnamo il grafico, prima di investigare sul perché di una simile strategia:

 

notes_on_sharpening_03-01

(Fig 3.1) Transizione di Intensità e Differenza di Gaussiane.

Il concetto che sta dietro alla Differenza di Gaussiane (DoG, Difference of Gaussians) è piuttosto semplice: il rumore appartiene solitamente alle alte frequenze, ed è spazzato via in entrambe le versioni sfocate, dunque non verrà evidenziato; d’altra parte, le due versioni contengono dettaglio in diverse gamme di frequenza. Dunque la sottrazione è un modo di evidenziare proprio quella finestra di frequenze:

notes_on_sharpening_03_02

(Fig 3.2) La sottrazione tra due versioni dell’originale sfocate (GB) con diversi raggi

notes_on_sharpening_03-03

(Fig 3.3) L’originale più il risultato della differenza da la versione contrastata; il dettaglio nelle alte frequenze non è toccato dalla DoG (per ammorbidire l’effetto è possibile abbassare l’opacità del LL o una curva per ridurre il contrasto del livello di differenza)

notes_on_sharpening_03-04

(Fig 3.4) DoG con R1=4.0 e R2=20.0 e SS2, applicando LL con un ulteriore abbassamento a 50% dell’opacità

Riporto qui la DoG perché rappresenta un primo passo fuori dai binari dello sharpening tradizionale; nei campi in cui è abitualmente utilizzata si consiglia un rapporto dei raggi di sfocatura da 4:1 a 5:1, mentre un rapporto di 1.6 simula la Laplaciana delle Gaussiane (LoG: un operatore che calcola la derivata seconda dell’intensità del segnale, e dunque è utile per trovare bordi. Spero di riuscire presto ad aggiungere altro materiale sul LoG).

Devo ancora testare la DoG approfonditamente: nonostante ciò, un’importante caratteristica che voglio notare è la somiglianza con la maschera di contrasto inversa (con alto raggio e bassa quantità). C’è una grossa differenza, però: la DoG incide poco o niente sui bordi, perché appartengono al range delle alte frequenze che come abbiamo visto non viene spinto (poca differenza nei bordi tra GB1 e GB2 significa poco incremento di contrasto). Questo può essere un beneficio in flussi di lavoro dove sono pianificati diversi cicli di sharpening e vale la pena consumare il tempo per un passaggio extra.

4. Altri kernel di sfocatura

Chiarito che sfocatura e differenza sono alla base del processo di sharpening, ho cominciato a chiedermi cosa sarebbe successo se al posto di GB (o assieme ad esso) fossero usati kernel diversi.

Prendiamo ad esempio Sfocatura di Superficie (Surface Blur, SB), meglio noto al di fuori di Photoshop come Filtro Bilaterale: un algoritmo di sfocatura che preserva i bordi. Se preserva i bordi e sfoca tutto il resto, dovremmo immediatamente pensare: SB uguale qualcosa per evidenziare tutto tranne i bordi. Vediamo:

notes_on_sharpening_04-01

(Fig 4.1) Sottrazione usando il filtro preserva bordi SB in luogo di GB

notes_on_sharpening_04-02

(Fig 4.2) Agendo meno sui bordi, le texture sono più evidenziate

notes_on_sharpening_04-03

(Fig 4.3) Il risultato con SB Raggio = 6 e Soglia = 15

Il risultato è quello che immaginavamo. A parte il fatto che SB non è il filtro più veloce nell’arsenale di Photoshop, ci sono un paio fatti piuttosto seccanti. E’ richiesta un po’ di pratica per trovare il giusto mix di Raggio/Soglia; ma soprattutto, a causa dell’algoritmo stesso, a raggi molto ampi l’effetto si inverte, e invece di sfocare di più torna ad comparire il dettaglio:

notes_on_sharpening_04-04

(Fig 4.4) SB Con Soglia 15 e Raggio 6.0 – 50.0 – 100.0; SB a raggi molto alti inverte il suo effetto e ricompare il dettaglio

Un filtro di sfocatura che preserva i bordi decisamente migliore è l’operatore WLS (Weighted Least Squares: minimi quadrati pesati). A meno di essere programmatori un po’ abili o di riuscire a mettere le mani su un computer su cui siano installati contemporaneamente MatLab e Photoshop, usarlo è un po’ un problema. I risultati sono comunque rilevanti – si veda il link nella sezione dei collegamenti.

5. Uso combinato di diversi kernel di sfocatura

A questo punto vorrei introdurre l’uso contemporaneo dei filtri GB e SB (cioè due kernel che differiscono per come trattano i bordi) per modulare lo sharpening. Scriviamo un paio di righe di algebra poco ortodossa. Essendo O l’immagine originale, T la texture ed E i bordi (Edges), gli ultimi due entrambi appartenenti alle alte frequenze, abbiamo visto che:

GB = O – (T+E); (Eq. 5.1)

SB = O – T; (Eq. 5.2)

La sottrazione da la componente E dei bordi:

(SB – GB) = O – T – O + T + E = E; (Eq. 5.3)

Mentre, riarrangiando la seconda equazione, proviamo che le texture sono evidenziate da SB:

(O – SB) = T; (Eq. 5.4)

Ora abbiamo tutti gli elementi per modulare lo sharpening, separando l’effetto nei bordi e nelle texture. Vediamo: le seguenti immagini sono le versioni GB, SB e la sottrazione scalata di cui abbiamo parlato.

 

notes_on_sharpening_05-01

(Fig 5.1) Sottrazione tra SB (Raggio=6 Soglia=15) and GB (Raggio=4) per ottenere un canale che evidenzierà solamente i bordi

notes_on_sharpening_05-02

(Fig 5.2) L’applicazione dello sharpening solo sui bordi LL opacità 50%

notes_on_sharpening_05-03

(Fig. 5.3) Il risultato usando SB (Raggio = 6 e Soglia = 15) e GB (Raggio = 4)

Ciò che dovrebbe risultare è uno sharpening solo sui bordi. A questo punto abbiamo in mano un nuovo efficace strumento: siamo in grado di avere uno sharpening su bordi e texture contemporaneamente (con GB), solo sulle texture (con SB) o solo sui bordi (con SB – GB). Un effetto più pronunciato può essere ottenuto con una maggiore opacità dei livelli LL (quando possibile) o con un livello di aggiustamento a curva sigmoide (cioè a forma di S) clippato, la cui opacità può essere variata per un controllo ancora più fine. Il tutto può facilmente essere automatizzato per rendere più rapide le operazioni.

6. Scomposizione delle immagini

Fino ad ora abbiamo cercato di differenziare lo sharpening su elementi che appartengono allo stesso range di frequenze (alte: texture, bordi). Un’immagine però di solito contiene contemporaneamente frequenze diverse: le alte corrispondono a dettagli più fini (capelli, ad esempio), le basse a transizioni tonali più morbide (il chiaroscuro sulle guance in un ritratto). E’ possibile modulare diversamente su ogni frequenza uno sharpening appropriato, e per facilitarci il compito ricorreremo alla scomposizione piramidale: che altro non è che un modo di scomporre un’immagine in range di frequenze (alte, medie, basse, ad esempio)

Per fortuna la matematica che sta a monte della scomposizione è piuttosto semplice: userò il filtro GB (dunque costruiremo una piramide gaussiana, in questo caso di tre livelli, ma si possono estendere a piacere); essendo O l’immagine originale, GBn(O) il filtro GB applicato ad O con raggio crescente con n:

U0 = O; (Eq. 6.1)

U1 = GB1(O); (Eq. 6.2)

U2 = GB2(O); (Eq. 6.3)

U3 = GB3(O); (Eq. 6.4)

Definiamo le differenze Dn come segue:

D1 = U0 – U1; (Eq. 6.5)

D2 = U1 – U2; (Eq. 6.6)

D3 = U2 – U3; (Eq. 6.7)

Così l’immagine può essere scomposta in:

O = U3 + D1 + D2 + D3; (Eq. 6.8)

Infatti, sostituendo le differenze otteniamo:

O = U3 + U0 – U1 + U1 – U2 + U2 – U3 = U0 = O; (Eq. 6.9)

Rientriamo in Photoshop per costruire questa piramide. Abbiamo bisogno di usare il filtro GB e di fare sottrazioni, qualcosa che ormai dovrebbe esserci familiare.
I tre raggi di GB definiscono i range delle frequenze. Ho scelto raggi piuttosto piccoli (1px, 5px, 15px) perchè l’immagine di esempio che sto usando è piccola. A seconda della risoluzione della vostra, i raggi possono variare. Il suggerimento è quello di usare il raggio minore corrispondente a quello che usereste applicando convenzionalmente USM (la maschera di contrasto), il raggio maggiore corrispondente a quello di HiRaLoAm e quello intermedio… ad un valore intermedio. Ecco i tre U1, U2, U3 e le differenze D1, D2, D3 così come le abbiamo definite (sto usando SS2):

notes_on_sharpening_06-01

(Fig. 6.1) U1, U2 e U3, cioè GBn(O)

notes_on_sharpening_06-02

(Fig 6.2) D1 = U0 – U1

notes_on_sharpening_06-03

(Fig 6.3) D2 = U1 – U2

notes_on_sharpening_06-04

Fig 6.4) D3 = U2 – U3

Ora che tutti gli elementi sono stati creati, è ora di comporre la piramide nella palette dei livelli di Photoshop. In un nuovo Set, dal basso verso l’alto: la versione maggiormente sfocata (con raggio più alto U3, poi D1, D2, D3, tutte e tre LL 100% opacità (questo perchè sto usando SS2). Ecco come dovrebbero essere le palette dei Livelli e dei Canali:

06-05

(Fig 6.5) Palette dei Canali e dei Livelli dopo la ricomposizione della piramide

Nonostante l’affollamento (un’azione può automatizzare facilmente il tutto) il processo non è complesso, ed è poi possibile eliminare i canali che non servono più. Accendendo e spegnendo il set non si dovrebbe notare alcuna differenza, il che significa che tutto è andato secondo i piani. Ottimo! E adesso?

7. Un Equalizzatore di sharpening

La nostra immagine scomposta ci offre la possibilità di costruire un equalizzatore a 3 slider (o più, a seconda dei livelli in cui abbiamo scomposto l’immagine) molto velocemente. Su ogni livello Dn aggiungiamo un livello di aggiustamento – curve clippato, con una curva a forma di S, e poi moduliamo le opacità di queste curve:

07-01corr

(Fig 7.1) La curva a forma di S comune a tutti i livelli di aggiustamento clippati alle Dn. L’opacità di queste curve controlla lo sharpening nelle frequenze Alte, Medie e Basse, così come sono state definite dai raggi dei GB (0.5, 2.0, 4.0 per queste piccole immagini dimostrative). Accanto, la palette dei livelli nella sua configurazione finale

Il tutto potrebbe ricordare il plugin KPT Equalizer (be’, senza la sua peculiarissima interfaccia:) è possibile usare valori negativi – cioè non evidenziare (sharpening) ma ridurre (sfocatura) un range di frequenze – abbassando l’opacità sotto al 50% avendo usato SS1, o abbassando l’opacità dei livelli Dn avendo usato SS2. Di seguito una versione:

notes_on_sharpening_07-02

(Fig 7.2) Una delle tante possibilità ottenute giocando con gli sliders dello sharpening sulle tre frequenze

8. Piramide Bilaterale e Piramide WLS

E’ possibile usare diversi kernel di sfocatura, e le equazioni della scomposizione piramidale sono ancora valide. Vediamo, ad esempio, con SB:

notes_on_sharpening_08-01

(Fig 8.1) SB1(O) (Raggio=2; Soglia=6), SB2(O) (R=3, T=10), SB3(O) (R=7, T=15)

notes_on_sharpening_08-02

((Fig 8.2) Livelli di differenza D1, D2, D3 (sto usando SS1 perchè siano più evidenti)

notes_on_sharpening_08-03

(Fig 8.3) Il risultato dello sharpening con scomposizione piramidale bilaterale

Riuscite ad individuare la differenza tra l’equalizzazione con una piramide bilaterale (cioè che usa SB) e quella Gaussiana? Forse non molto qui, ma provando con le vostre immagini (ad alta risoluzione, magari a 16bit ma non è necessario) scoprirete che essendo SB un filtro preserva-bordi, la piramide bilaterale mostra pochi o addirittura nessun alone, il che è un bel vantaggio a mio parere. Ricostruendo “a mano” il comando di Photoshop Luci/Ombre con SB al posto di GB nel suo motore si ottengono i medesimi vantaggi, tra parentesi.

Come abbiamo già visto, il filtro WLS è migliore del bilaterale, dunque può essere usato con risultati ancora più sorprendenti (si veda nel sito dei creatori di WLS un video veramente notevole. Adobe, nessuno in ascolto ? 🙂

9. Scomposizioni piramidali miste

Che lo si trovi bizzarro o meno, ci è concesso di mischiare contemporaneamente diversi kernel di sfocatura e le equazioni funzionano ancora. Ricordando quello che abbiamo visto nel paragrafo 5 (uso combinato di diversi kernel di sfocatura), ho scritto che:

(SB – GB) = E; (Eq. 9.1)

Se modifichiamo gli assunti della scomposizione piramidale in questo modo:

U0 = O; (Eq. 9.2)

U1 = SB1(O); (Eq. 9.3)

U2 = GB1(O); (Eq. 9.4)

otteniamo una scomposizione in 2 livelli con:

D1 = U0 – U1 =O – SB1(O) = T; (Eq. 9.5)

con quello che sappiamo dalla eq. 5.4. abbiamo dunque:

D2 = U1 – U2 =SB1(O) – GB1(O) = E; (Eq. 9.6)

che deriva dalla eq. 5.3. Dunque D1 è un livello di differenza di una scomposizione mista che contiene, e dunque può evidenziare, le frequenze relative alle sole texture; e D2 è un livello di differenza di una scomposizione mista che contiene, e dunque può evidenziare, le frequenze relative ai soli bordi.
Ecco i livelli di differenza:

notes_on_sharpening_09-01

Fig 9.1) O – SB1(O) = D1, il livello che contiene solo il dettaglio relativo alle texture (SB Raggio=3, Soglia=16)

notes_on_sharpening_09-02

(Fig 9.2) SB1(O) – GB1(O) = D2, il livello di dettaglio dei bordi (GB Raggio=2)

Di seguito le palette dei Canali e dei Livelli:

09-03

(Fig 9.3) Channels and Layers palettes of a Mixed Pyramid.

Ora possiamo aggiungere i soliti livelli di aggiustamento – curve clippati ai Dn e giocare con gli sliders. Ecco una versione di esempio:

notes_on_sharpening_09-04

10. Conclusioni (temporanee)

Ho cercato di riunire qui materiale proveniente da diverse fonti e le mie personali scoperte attorno al tema (del resto molto soggettivo) dello sharpening. Ero molto interessato nel dimostrare l’uso combinato di diversi kernel di sfocatura, e il perchè la scomposizione piramidale sia una piattaforma sulla quale sviluppare con successo nuove strategie di sharpening. Trovare nuovi modi di usare in maniera più sofisticata i soliti vecchi strumenti per ottenere risultati anche leggermente migliori paga per il tempo speso nella ricerca. Ho comunque ancora molti punti aperti, ad esempio come simulare la soglia della USM. Nonostante ciò sono abbastanza soddisfatto dei risultati; usare questi strumenti significa aggiungere diversi passaggi (che però possono essere automatizzati) e a seconda del tipo di progetti nei quali si è coinvolti, credo che quando sia necessario un controllo più fine e si abbia il tempo per ricercarlo, sia possibile usare questi workflow anche in ambienti di produzione. Resta comunque una ricerca che ha anche lo scopo di stimolare personali sperimentazioni.

Ho sempre creduto nella condivisione della conoscenza e nei progetti plurali, dunque aspetto suggerimenti, correzioni e proposte. Ho in mente di tenere l’articolo aggiornato, controllate il numero di revisione in alto nella pagina – ho una lista piuttosto lunga di cose da aggiungere (azioni, script, ecc). Vi invito a lasciare un commento nella sezione apposita – nel caso vogliate essere avvisati della pubblicazione di nuovo materiale o per altri feedback personali – undavide at gmail dot com.

notes_on_sharpening_10-01


Davide Barranca

Lives and works near Bologna, Italy.
He’s the developer of ALCE, VitaminBW, Double USM, PS Projects and Floating Adjustments.
Davide is also a color-management aware photo-retoucher, focused in color-correction and image enhancement in fine-art photography, art reproduction photography and fine-art digital printing. Interested in academic research around digital imaging, stitching, HDRI, custom filters writing.
Specialties: Pre-press, broad experience in working side by side with photographers trying to convert from artist to technical language.
You can visit his site here >