Filtro convoluzione

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

La classe ConvolutionFilter può essere utilizzata per applicare agli oggetti BitmapData o agli oggetti di visualizzazione un'ampia gamma di trasformazioni dell'immagine quali sfocatura, rilevamento dei bordi, contrasto, rilievo e smussatura.

Da un punto di vista concettuale, il filtro convoluzione scorre uno a uno i pixel nell'immagine di origine e determina il colore finale di ogni pixel mediante il valore del pixel e di quelli che lo circondano. Una matrice, specificata come array di valori numerici, indica quanto il valore di ogni pixel vicino influisce sul valore risultante finale.

Prendete in considerazione il tipo di matrice utilizzato più frequentemente, e cioè una matrice tre per tre. La matrice è composta da nove valori:

N    N    N 
N    P    N 
N    N    N

Quando il filtro convoluzione viene applicato a un determinato pixel, viene considerato il valore di colore del pixel stesso (“P” nell'esempio), oltre che i valori dei pixel che lo circondano (“N” nell'esempio). Tuttavia, impostando i valori nella matrice, potete specificare quale livello di priorità hanno determinati pixel nell'influire sull'immagine finale.

La matrice seguente, ad esempio, applicata mediante un filtro convoluzione, lascia l'immagine esattamente com'è:

0    0    0 
0    1    0 
0    0    0

Il motivo per cui l'immagine rimane invariata consiste nel fatto che il valore del pixel originale ha un'intensità relativa pari a 1 nel determinare il colore finale del pixel, mentre i valori dei pixel circostanti hanno un'intensità relativa pari a 0 (che significa che i colori di questi pixel non influiscono sull'immagine finale).

In modo analogo, questa matrice fa spostare di un pixel verso sinistra i pixel di un'immagine:

0    0    0 
0    0    1 
0    0    0

Notate che in questo caso il pixel stesso non ha alcun effetto sul valore finale del pixel visualizzato in tale posizione dell'immagine finale: solo il valore del pixel sulla destra viene utilizzato per determinare il valore risultante del pixel.

In ActionScript, è possibile creare la matrice come combinazione di un'istanza Array contenente i valori e due proprietà che specificano il numero di righe e colonne nella matrice. L'esempio seguente carica un'immagine e, al termine del caricamento, applica un filtro convoluzione all'immagine mediante la matrice dell'esempio precedente:

// Load an image onto the Stage. 
var loader:Loader = new Loader(); 
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); 
loader.load(url); 
this.addChild(loader); 
 
function applyFilter(event:MouseEvent):void 
{ 
    // Create the convolution matrix. 
    var matrix:Array = [0, 0, 0, 
                                     0, 0, 1, 
                                     0, 0, 0]; 
     
    var convolution:ConvolutionFilter = new ConvolutionFilter(); 
    convolution.matrixX = 3; 
    convolution.matrixY = 3; 
    convolution.matrix = matrix; 
    convolution.divisor = 1; 
     
    loader.filters = [convolution]; 
} 
 
loader.addEventListener(MouseEvent.CLICK, applyFilter);

Una cosa che non appare ovvia in questo codice è l'effetto dell'uso nella matrice di valori diversi da 1 o 0. La stessa matrice, ad esempio, con il numero 8 anziché 1 nella posizione destra esegue la stessa azione (cioè sposta i pixel verso sinistra). Inoltre, influisce sui colori dell'immagine, rendendoli 8 volte più brillanti. Ciò accade perché i valori di colore del pixel finale vengono calcolati moltiplicando i valori della matrice per i colori dei pixel originali, combinando i valori e dividendo il risultato per il valore della proprietà divisor del filtro. Notate che nel codice di esempio la proprietà divisor è impostata su 1. Come regola generale, se desiderate che la luminosità dei colori rimanga più o meno la stessa dell'immagine originale, dovete rendere il divisore uguale alla somma dei valori di matrice. Pertanto, nel caso di una matrice in cui la somma dei valori è pari a 8 ed è presente un divisore pari a 1, l'immagine risultante sarà circa 8 volte più luminosa di quella originale.

Anche se l'effetto di questa matrice non è particolarmente distinguibile, è possibile utilizzare altri valori di matrice per creare diversi effetti. Di seguito vengono elencati alcuni set standard di valori di matrice per diversi effetti, che utilizzano una matrice tre per tre:

  • Sfocatura di base (divisore 5):

         0 1 0 
         1 1 1 
         0 1 0
  • Aumento della nitidezza (divisore 1):

         0, -1, 0 
        -1, 5, -1 
         0, -1, 0
  • Rilevamento dei bordi (divisore 1):

         0, -1, 0 
        -1, 4, -1 
         0, -1, 0
  • Effetto rilievo (divisore 1):

        -2, -1, 0 
        -1, 1, 1 
         0, 1, 2

    Notate che per la maggior parte di questi effetti il divisore è 1. Infatti, i valori di matrice negativi aggiunti ai valori di matrice positivi producono il risultato 1 (oppure 0 nel caso del rilevamento dei bordi, ma il valore della proprietà divisor non può essere 0).