Evrişim filtresi

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

BitmapData nesnelerine veya görüntüleme nesnelerine bulanıklaştırma, kenar algılama, keskinleştirme, kabartma ve eğim verme gibi çeşitli görüntüleme dönüştürmeleri uygulamak için ConvolutionFilter sınıfı kullanılabilir.

Evrişim filtresi kavramsal olarak kaynak görüntüdeki her pikselde birer birer ilerler ve pikselin ve çevreleyen piksellerin değerini kullanarak son rengi belirler. Sayısal değerler dizisi olarak belirtilen bir matris, yakındaki piksellerin her birinin değerinin sonuçta elde edilen değeri ne derece etkilediğini belirtir.

3 x 3 matris olarak bilinen ve yaygın olarak kullanılan matris türünü göz önünde bulundurun. Matris, dokuz değer içerir:

N    N    N 
N    P    N 
N    N    N

Belirli bir piksele evrişim filtresi uygulandığında, pikselin kendi renk değerinin yanı sıra (örnekte “P”), çevreleyen piksellerin değerlerine de (örnekte “N” etiketli) bakar. Ancak, matristeki değerleri ayarlayarak belirli piksellerin sonuçta elde edilen görüntüyü etkileme konusunda ne kadar önceliğe sahip olduğunu belirtirsiniz.

Örneğin, evrişim filtresi kullanılarak uygulanan matris, görüntüyü değiştirmeden olduğu gibi bırakır:

0    0    0 
0    1    0 
0    0    0

Görüntünün değişmemesinin nedeni, orijinal piksel değeri, son piksel renginin belirlenmesinde 1 göreceli kuvvetine sahipken, çevreleyen piksellerin değerinin 0 göreceli kuvvetine sahip olmasıdır, başka bir deyişle, çevreleyen pikseller son görüntüyü etkilemez.

Aynı şekilde, bu matris de görüntünün piksellerinin bir piksel sola kaydırılmasını sağlar:

0    0    0 
0    0    1 
0    0    0

Bu durumda, pikselin, son görüntü üzerinde o konumda görüntülenen son piksel değeri üzerinde herhangi bir etkisi olmadığına, pikselin son değerini belirlemek için yalnızca sağdaki pikselin değerinin kullanıldığına dikkat edin.

ActionScript'te, değerleri içeren bir Array örneği ile matristeki satır ve sütunların sayısını belirten iki özelliğin bir birleşimi olarak matrisi oluşturursunuz. Aşağıdaki örnek, bir görüntüyü yükler ve görüntünün yüklemesi sona erdiğinde önceki listede bulunan matrisi kullanarak görüntüye bir evrişim filtresi uygular:

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

Bu kodda mutlak olmayan şey, matriste 1 veya 0 dışındaki değerlerin kullanılmasının oluşturduğu efekttir. Örneğin, sağ konumda 1 yerine 8 sayısının yer aldığı aynı matris de aynı eylemi gerçekleştirir. (Pikselleri sola kaydırır.) Ayrıca bu, görüntülerin renklerini etkileyerek bunları 8 kat büyütür. Bunun nedeni, matris değerleri ile orijinal piksel renklerinin çarpılıp değerler birlikte toplandıktan sonra filtrenin divisor özelliğinin değerine sonucun bölünmesiyle son piksel rengi değerlerinin hesaplanmasıdır. Örnek kodda divisor özelliğinin 1 değerine ayarlandığına dikkat edin. Genel bir kural olarak, renklerin parlaklığının orijinal görüntüdeki gibi aynı şekilde kalmasını istiyorsanız, böleni, matris değerlerinin toplamına eşit tutmanız gerekir. Böylece, değerlerin 8'e kadar toplandığı ve bölenin 1 olduğu bir matrisle, sonuçta elde edilen görüntü, orijinal görüntüden hemen hemen 8 kat daha parlak olur.

Bu matrisin efekti çok fazla fark edilmese de, çeşitli efektler oluşturmak için başka matris değerleri kullanılabilir. Aşağıda, 3 x 3 matrisi kullanan farklı efektler için birçok standart matris değeri kümesi verilmiştir:

  • Temel bulanıklaştırma (bölen 5):

         0 1 0 
         1 1 1 
         0 1 0
  • Keskinleştirme (bölen 1):

         0, -1, 0 
        -1, 5, -1 
         0, -1, 0
  • Kenar algılama (bölen 1):

         0, -1, 0 
        -1, 4, -1 
         0, -1, 0
  • Kabartma efekti (bölen 1):

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

    Bu efektlerin çoğunda bölenin 1 olmasına dikkat edin. Bunun nedeni, pozitif matris değerlerine eklenen negatif matris değerlerinin 1 sonucunu vermesidir (veya kenar algılama durumunda 0 sonucu verilir ancak divisor özelliğinin değeri 0 olamaz).