Pietra angolare di moltissime funzioni negli Image Processor, le matrici di convoluzione vengono spesso preimpostate e mascherate con nomi più comprensibili (Sharpen, Blur...) per evitare all’utente di doverne comprendere a pieno il funzionamento.
Questo è dovuto al fatto che la creazione di una matrice non è una operazione intuitiva, ed il considerevole tempo che ognuna di esse richiede per essere calcolata non invoglia gli utenti alle sperimentazioni casuali.
Di fatto però rinunciare ad adoperare le convoluzioni oppure affidarsi solamente a quelle pre-impostate è una grave autolimitazione che ci priva di un alleato potente e soprattutto versatile.
Matrici di convoluzione in pratica
Senza pretendere di spiegare in dettaglio il loro funzionamento, teoricamente piuttosto semplice ma allo stesso tempo complesso quando lo si deve implementare in un programma, vediamo di dare una spiegazione pratica delle convoluzioni evitando per quanto possibile il ricorso alla matematica e pensando piuttosto alle immagini. Per gli esperimenti, puoi salvare l'immagine qui sotto o usarne una tua.
Intanto possiamo definire quello della convoluzione come un algoritmo spaziale, destinato cioè a lavorare su più pixel contemporaneamente seguendo una precisa relazione geometrica. Una tipica matrice di convoluzione appare come una griglia di numeri simile a questa:
-1 0 1
-1 0 1
-1 0 1
Imaginiamo che la griglia sia un particolare tipo di “lente di ingrandimento”, che possiamo spostare a piacimento sulla nostra immagine a condizione di porre il centro della griglia su un pixel. Questo è necessario nell’Image Processing digitale perché non è possibile indirizzare meno di un pixel senza lentissime interpolazioni, ed è anche il motivo per cui le matrici sono sempre dispari.
La nostra “lente matematica” ci restituirà un colore che corrisponde al valore medio della somma tra il pixel centrale moltiplicato per il valore assegnato alla posizione centrale, e la somma di tutti i pixel circostanti moltiplicati per i valori assegnati loro.
In realtà le operazioni da compiere sono più complesse e tengono conto del fatto che il valore restituito dalla matrice può essere superiore alla massima intensità colore su cui lavoriamo oppure può risultare negativo. Di questo, come delle operazioni da compiere in prossimità dei bordi, si occupa il software, e l’utente può tranquillamente assumere che il colore risultante sarà “corretto”.
Il colore che otterremo verrà scritto nell’immagine definitiva nella stessa posizione dell’immagine di partenza. Ripetendo sistematicamente, dall’alto verso il basso e da sinistra verso destra questa operazione, ricaveremo una nuova immagine nella quale ogni pixel sarà stato modificato secondo la relazione impostata da noi e in base ai colori dei pixel confinanti.
Non è importante comprendere la semplificazione appena descritta per poter usare con successo le matrici di convoluzione, ma è necessario tenere a mente questi principi fondamentali:
- Una matrice, anche se è composta da molti numeri e prende in considerazione altrettanti pixel, altera solamente il pixel corrispondente al centro della matrice.
- Il valore del pixel alterato dipende dai valori dei pixel originali e dal peso assegnato agli elementi della matrice.
- I pixel corrispondenti ad elementi della matrice posti a zero non hanno un effetto diretto sul pixel risultante.
- Quelli corrispondenti ad elementi positivi aggiungono il loro valore al pixel risultante.
- Quelli corrispondenti ad elementi negativi della matrice sottraggono il loro valore dal pixel risultante.
Vediamo immediatamente un esempio pratico con la seguente matrice 3x3 (detta di Laplace) che serve ad identificare i contorni in un’immagine. Per questo esercizio adopereremo il filtro Altro/Personale di Photoshop:
-1 -1 -1
-1 8 -1
-1 -1 -1
Per ogni punto dell’immagine verranno presi in considerazione gli otto pixel che confinano con essa, ed il valore di ciascuno verrà moltiplicato per –1. Tutti questi valori verranno poi sommati al valore del pixel preso in esame moltiplicato per otto.
Se il risultato fosse negativo o zero il pixel verrebbe posto a zero (nero), mentre se fosse positivo rappresenterebbe il nuovo valore di quel pixel. Proviamo a vedere cosa avverrebbe se la zona presa in esame fosse così composta (questa non è una matrice di convoluzione, ma un gruppo di pixel dell’immagine al quale applichiamo la matrice precedente):
255 255 255
255 255 255
255 255 255
Moltiplichiamo ognuno dei pixel di contorno per il corrispondente valore della matrice (-1) e quindi li sommiamo, ottenendo –2048. Moltiplichiamo anche il valore del punto centrale per 8 ottenendo 2048; a questo punto li sommiamo ed otteniamo zero, ovvero il nero. Poiché l’area era composta di pixel dello stesso colore non abbiamo identificato nessuno spigolo. Vediamo questa altra situazione:
100 100 100
100 255 100
100 100 100
in questo caso avremmo –800 per i pixel circostanti per quello centrale 2048 ovvero 1240, un valore positivo che, opportunamente scalato, ci restituirebbe un pixel colorato di intensità proporzionata al tipo di spigolo rilevato.
D'accordo, ma quando arrivano immagini interessanti?
Osserviamo ora nella figura l’effetto di una matrice di convoluzione di Laplace applicata all’immagine.
Come è evidente sono stati identificati gli spigoli, tracciati in chiaro, mentre le zone omogenee dell’immagine sono state spinte verso il nero. È facile intuire come questa immagine, che ricorda certe tecniche di disegno con la cera, sia in realtà una parte dell’effetto di Sharpen.
Se infatti la miscelassimo con l’immagine di partenza, “forando” il nero, otterremmo un effetto analogo a quello di Sharpen. Ma è davvero necessario effettuare questo secondo passaggio di miscelazione? Proviamo ad osservare questa matrice, molto simile alla precedente:
-1 -1 -1
-1 9 -1
-1 -1 -1
L’unica differenza è nel valore (nel “peso”) da attribuire al punto centrale: 9 anziché 8. Questo corrisponde, all’atto pratico, a sommare nuovamente al risultato il colore del pixel originale.
In questo modo i pixel che in precedenza apparivano neri (nessuno spigolo) apparirebbero nel colore dell’immagine originale mentre quelli “colorati”, corrispondenti agli spigoli, verrebbero intensificati.
Vediamo ora la matrice per l’effetto opposto, e cioè per il Blur:
1 1 1
1 1 1
1 1 1
Non dovrebbe essere difficile accorgersi che questa matrice non fa altro che riscrivere nel pixel preso in esame la media dei valori di tutti i suoi confinanti, producendo quindi un ammorbidimento degli spigoli troppo acuti.
In questo caso abbiamo dovuto impostare il fattore di scala su 9 per ottenere la media di tutti i pixel (la matrice di 3x3 valori ne contiene appunto 9). Non facendolo l'immagine sarebbe apparsa bruciata.
A questo punto è necessario iniziare a creare delle matrici in proprio, magari su carta, e cercare di immaginare quale sarà il loro effetto prima di applicarle. Solo così sarà possibile ottenere la padronanza delle convoluzioni necessaria per un loro uso creativo.
Prima però di passare alle sperimentazioni personali, osserviamo una matrice che può avere un’applicazione immediata nella grafica 3D e nel compositing:
1 1 1 1 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1
Si tratta di una matrice 5x5, rispetto alle 3x3 che abbiamo visto fino ad ora, ma non è il caso di spaventarsi, il meccanismo è semplice: poiché il pixel preso in esame viene moltiplicato per zero (è sempre il valore al centro della matrice) non contribuirà per nulla al colore del pixel stesso, così come non contribuiranno quelli vicini. Solo la cornice esterna avrà influenza, traslando di fatto i punti e contemporaneamente miscelandoli.
Attenzione: il fatto che il pixel centrale non venga preso in esame non vuol dire che scompaia dall’immagine definitiva! Il pixel centrale influirà infatti sul colore di altri pixel quando saranno questi ad essere esaminati.
Per tornare sull’esempio della lente, immaginiamo che questa matrice sia dipinta di nero al centro e trasparente solo ai bordi, un pò come un filtro per guardare il sole: il fine di entrambi è infatti quello di esaltare la periferia, ignorando il centro.
Il risultato sarà una sdoppiamento sfocato dell’immagine che può rapidamente simulare l’effetto della profondità di campo in un software di rendering, oppure essere adoperato per porre “in secondo piano” una porzione di immagine per focalizzare l’attenzione dell’osservatore su dei dettagli ben precisi.
In questo caso il fattore di scala deve essere 16 e non 25 perchè dei 25 punti presi in esame, solo 16, la cornice esterna, contribuiscono all'immagine, i nove punti interni sono tutti a zero.
Ma a cosa mi serve sapere tutto questo?
Intanto, adesso sai a cosa serve uno dei più misteriosi filtri di Photoshop. Ma la cosa più importante è che le matrici di convoluzione sono alla base di quasi qualsiasi effetto. Se il tuo obiettivo è essere un esperto di compositing, conoscere questi aspetti è necessario.
Inoltre, adesso, hai probabilmente un'idea più chiara del motivo per cui se non attivi Repeat Edge Pixels nel Fast Blur di After Effects, i contorni dell'immagine appaiono scuri: la matrice di convoluzione trova pixel neri, a zero, al difuori dei margini dell'immagine e li somma all'area presa in esame.
Da ultimo, se adoperi un Find Edges per creare una maschera sui contorni dell'immagine, devi sempre modificarlo per ottenere il risultato che desideri. Applicando una matrice di Laplace, e modificandola il Find Edges non è più una scatola nera, ma uno strumento che controlli completamente. Insomma, come sempre nel compositing professionale, la differenza sta tutta nella versatilità dello strumento.