Filtr Konwolucja

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Klasa ConvolutionFilter może być używana w celu stosowania szerokiej gamy transformacji obrazowania do obiektów BitmapData lub obiektów wyświetlanych, np. rozmywanie, wykrywanie krawędzi, wyostrzanie, płaskorzeźba i fazy.

Co do koncepcji, filtr przechodzi przez piksele w obrazie źródłowym pojedynczo, wyznaczając kolor końcowy danego piksela na bazie wartości dla tego piksela oraz pikseli go otaczających. Macierz, określona jako tablica wartości liczbowych, oznacza, do jakiego stopnia wartość każdego z pikseli wpływa na końcową, wynikową wartość.

Załóżmy, że nasza macierz ma najczęściej spotykane wymiary, to jest trzy na trzy. Macierz obejmuje dziewięć wartości:

N    N    N 
N    P    N 
N    N    N

Po nałożeniu filtra konwolucji na dany piksel przyjmuje on wygląd odpowiadający wartości koloru samego piksela (w tym przykładzie oznaczonych „P”), oraz wartości pikseli go otaczających (oznaczonych „N” w tym przykładzie). Ustawienie wartości w macierzy umożliwia określenie, jak wysoki priorytet mają poszczególne piksele, jeśli chodzi o wpływ na obraz wynikowy.

Na przykład w poniższej macierzy nałożenie filtra konwolucji pozostawi obraz dokładnie takim, jaki było on wcześniej:

0    0    0 
0    1    0 
0    0    0

Przyczyną braku zmian obrazu jest fakt, że wartość pikseli oryginalnych ma względny wpływ na wyznaczenie koloru pikseli końcowych wynoszącą 1, podczas gdy wartości pikseli otaczających mają względną wartość 0 — co oznacza, że ich kolory nie mają żadnego wpływu na obraz końcowy.

Podobnie, ta macierz spowoduje przesunięcie poszczególnych pikseli obrazu o jeden w lewo:

0    0    0 
0    0    1 
0    0    0

Należy zauważyć że w tym przypadku sam piksel nie ma żadnego wpływu na wartość końcową piksela wyświetlanego w tym miejscu na obrazie końcowym — jedynie wartość piksela po prawej służy do określenia wartości wynikowej dla piksela.

W języku ActionScript możliwe jest tworzenie macierzy w postaci kombinacji instancji Array zawierającej wartości oraz dwu właściwości określających liczbę wierszy i kolumn w macierzy. W poniższym przykładzie przedstawiono ładowanie obrazu oraz, po zakończeniu jego ładowania, zastosowanie filtru konwolucji do obrazu za pomocą macierzy w poprzednim listingu:

// 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);

To co nie jest w tym kodzie oczywiste, to efekt użycia w macierzy wartości innych niż 0 i 1. Na przykład ta sama macierz, z numerem 8 zamiast 1 w pozycji po prawej stronie, wykonuje to samo działanie (przesuwanie pikseli na lewo). Ponadto ma ona wpływ na kolory obrazu, rozjaśniając je 8-krotnie. Dzieje się tak, ponieważ wartości kolorów pikseli końcowych są obliczane przez przemnożenie wartości macierz przez kolory pikseli oryginalnych, dodanie do siebie wszystkich tych wartości oraz podzielenie przez wartość właściwości divisor filtra. Należy zwrócić uwagę, że w kodzie przykładowym właściwość divisor ustawiono na wartość 1. Należy przyjąć jako ogólną zasadę, ze w przypadku zachowania jasności kolorów na poziomie zbliżonym do ich jasności w obrazie oryginalnym należy ustawić podzielnik na wartość równą sumie wartości macierzy. Zatem więcej jeśli suma wartości macierzy daje 8, a podzielnik wynosi 1, obraz wynikowy będzie o około 8 razy jaśniejszy niż obraz oryginalny.

Mimo że efekt działania tej macierzy nie jest zbyt silnie zauważalny, zastosowanie innych wartości macierzy umożliwia osiąganie różnych ciekawych efektów. Poniżej zaprezentowano kilka standardowych zestawów wartości macierzy dających różne efekty (wszystkie macierze mają rozmiar trzy na trzy):

  • Rozmycie podstawowe (podzielnik 5):

         0 1 0 
         1 1 1 
         0 1 0
  • Wyostrzanie (podzielnik 1):

         0, -1, 0 
        -1, 5, -1 
         0, -1, 0
  • Wykrywanie krawędzi (podzielnik 1):

         0, -1, 0 
        -1, 4, -1 
         0, -1, 0
  • Efekt Płaskorzeźba (podzielnik 1):

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

    Należy pamiętać, że w przypadku większości z tych efektów podzielnik wynosi 1. Dzieje się tak, ponieważ dodanie do wartości macierzy ujemnej wartości macierzy dodatniej daje wynik 1 (lub 0 w przypadku wykrywania krawędzi, lecz z kolei wartość właściwości divisor nie może wynosić 0).