Python'da 2B filtreleme ve konvolusyon
Elinizde bir matris var (tipik bir örnek olarak gri-seviye bir resim olabilir). İstiyorsunuz ki matrisin her elemanının üstünden geçerken komşularına bakarak bir işlem yapayım. Örneğin bu işlem 8 adet komşusunun (sağ, sol, üst, alt ve köşeler) toplamı olsun.
Aklınıza ilk gelen şey matrisin üstünde gezmek için iç içe iki döngü yazıp ayrıca 8 adet noktaya bakmak olabilir. Bu durumda kenarlarda ve köşelerde hata almamak için bu durumları da hesaba katmalısınız. İç içe yazılan iki döngü Python'da size çok masraflı olacaktır. Bunun yerine filtreleme (süzgeçleme) kullanmak daha akıllıca.
Gelin tüm bu işlemi kolay bir hamlede yapalım.
Önce somut bir matris üretelim. A
matrisi 4 satır ve 5 sütundan oluşan test matrisimiz olacak:
import numpy as np from scipy.signal import convolve2d A = np.arange(1,21).reshape(4,5) # array([[ 1, 2, 3, 4, 5], # [ 6, 7, 8, 9, 10], # [11, 12, 13, 14, 15], # [16, 17, 18, 19, 20]])
Dedik ki, 8 komşunun toplamını alacağız. Şimdi 3x3'lük bir küçük matris yapalım. İçindeki tüm değerler 1 olsun, sadece merkezdeki 0 olsun. Bu küçük matrisi bir süzgeç misali büyük matrisin üstünde kaydıracağız ve 1 olan yerlerin altındaki değerleri toplayarak merkeze yazdıracağız. İşte matrisimiz:
b = np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1]])
Filtremizi tasarladık. Şimdi sıra geldi konvolusyonda (evrişim) kullanmaya:
toplam = convolve2d(A, b, 'same') # array([[ 15, 25, 30, 35, 23], # [ 33, 56, 64, 72, 47], # [ 58, 96, 104, 112, 72], # [ 40, 70, 75, 80, 48]])
Son parametrede 'same'
kullandık çünkü toplam
'ın A
ile aynı boyutta olmasını istedim. Filtre kenarlara geldiğinde A
matrisinin dışında kalan yerlerde 0 varmış gibi davrandı. Sonuç tam istediğimiz gibi!
Örnekte 8-komşulukta toplamı aldık. Ama istersek küçük matrisin tüm değerlerini 1/9
olarak atayıp komşularının ve kendisinin ortalamasını da alabilirdik. Ya da 4-komşuluk için bir filtre tasarlayabilirdik. Veya da sağdan veya soldan türevsi işlemler için; örneğin Sobel operatörleri için. Amacınıza göre filtre tasarlamak çok kolay. Gerisi tek satırda matrisleri evriştirmeye kalıyor...