Spatial Filtering (Pemfilteran Spasial)

Panduan belajar dari slide Agus Harjoko, bersumber dari Digital Image Processing (Gonzalez & Woods, ed. ke-4, Bab 3). Semua gambar di bawah dibuat dengan Python (NumPy + Matplotlib) memakai citra uji buatan sendiri, jadi bisa dilihat langsung efek tiap filter.

1. Apa itu spatial filtering? (slide 3-4)

Citra adalah matriks angka (intensitas). Filtering spasial artinya mengubah nilai tiap piksel berdasarkan nilai piksel itu dan tetangganya. "Spasial" berarti kita bekerja langsung pada piksel (posisi x,y), bukan pada frekuensi.

Alat utamanya: kernel (disebut juga mask, filter, atau window), yaitu matriks kecil (mis. 3×3) berisi koefisien/bobot.

Langkah kerja (untuk SETIAP piksel):
  1. Letakkan pusat kernel di atas piksel (x,y).
  2. Kalikan tiap koefisien kernel dengan piksel di bawahnya.
  3. Jumlahkan semua hasil kali, hasilnya menjadi nilai baru piksel (x,y) pada citra keluaran.
  4. Geser kernel ke piksel berikutnya, ulangi sampai semua piksel selesai.

Rumus 3×3: g(x,y) = Σ Σ w(s,t)·f(x+s, y+t) dengan s,t dari −1 sampai 1.

Kenapa origin kernel di tengah? Pada Gambar 3.34, origin citra ada di kiri atas, tetapi origin kernel di pusatnya. Dengan begitu indeks s,t berjalan simetris (−1,0,1), rumus jadi ringkas, dan hasil filter "menempel" tepat pada piksel yang sedang diproses. Karena itu ukuran kernel biasanya ganjil (3×3, 5×5, ...), supaya ada satu piksel pusat.

Linear vs non-linear: bila hasilnya hanya "kali lalu jumlah" seperti di atas, filternya linear (box, Gaussian, Laplacian, Sobel). Bila memakai operasi lain, misalnya urut lalu ambil nilai tengah, filternya non-linear (median).

Kritis: slide tidak membahas tepi citra. Di piksel pinggir, sebagian kernel "keluar" dari citra. Solusi umum: zero padding (isi 0, bisa membuat tepi menggelap), replicate (ulangi piksel tepi), atau reflect (cermin; dipakai pada gambar-gambar ini). Pilihan ini berpengaruh pada hasil di pinggir.

2. Korelasi dan konvolusi (slide 5)

RumusArti
KorelasiΣ w(s,t)·f(x+s, y+t)Kernel dipakai apa adanya
KonvolusiΣ w(s,t)·f(x−s, y−t)Kernel diputar 180° dulu (tanda minus)
Intinya: konvolusi = korelasi dengan kernel yang dibalik (atas↔bawah dan kiri↔kanan). Jika kernel simetris (box, Gaussian, Laplacian), hasilnya identik. Bedanya baru terasa pada kernel tak simetris seperti Sobel (tandanya terbalik).

Kenapa ada dua? Konvolusi punya sifat matematis bagus: komutatif (w⋆f = f⋆w), asosiatif, dan cocok dengan teori frekuensi (konvolusi di spasial = perkalian di frekuensi). Korelasi lebih intuitif untuk template matching (mencari pola). Banyak library (termasuk cv2.filter2D) sebenarnya menghitung korelasi walau diberi nama "convolution".

3. Contoh kernel penghalus (slide 6 & 9)

Box 3×3 (×1/9)
111
111
111
Gaussian 3×3 (K=1, σ=1), ×1/4,8976
0.36790.60650.3679
0.60651.00000.6065
0.36790.60650.3679

Gaussian dari fungsi G(s,t) = K·exp(−(s²+t²)/(2σ²)). Cek: pusat s=t=0 → e⁰ = 1; samping → e^(−1/2) = 0,6065; sudut → e^(−1) = 0,3679. Jumlah seluruhnya 4,8976, maka dibagi 4,8976 supaya total bobot = 1.

Kenapa dinormalisasi (jumlah = 1)? Supaya kecerahan rata-rata tidak berubah. Kalau jumlah bobot 2, citra jadi 2× lebih terang; kalau 0,5, jadi gelap.
Bentuk kernel 1-D: box memberi bobot sama pada semua tetangga; Gaussian memberi bobot besar pada yang dekat dan kecil pada yang jauh.

Perhatikan: σ mengatur "lebar" lonceng. σ besar → blur kuat. Aturan praktis: ukuran kernel ≈ 6σ (±3σ menangkap ~99,7% bobot). Kernel yang lebih kecil dari itu "memotong" lonceng dan hasilnya kurang akurat.

4. Lowpass: penghalus (slide 7-10)

Lowpass meloloskan perubahan lambat (area rata) dan meredam perubahan cepat (tepi tajam, detail halus, noise). Hasilnya citra lebih buram dan noise berkurang.

4.1 Box filter (Gambar 3.39)

Makin besar kernel, makin kuat blur: objek kecil hilang, garis halus menyatu, tepi jadi lembut.

4.2 Gaussian filter (Gambar 3.41-3.42)

Gaussian 43×43 σ=7 hasilnya mirip box 21×21, tetapi Gaussian lebih halus alami.

Slide menyatakan Gaussian 43×43 (σ=7) "sebanding" dengan box 21×21. Itu benar secara tingkat blur, tetapi sifatnya berbeda.

Kenapa Gaussian umumnya lebih disukai? (1) bobot menurun mulus sehingga tanpa artefak kotak, (2) isotropik (sama ke segala arah), (3) bisa dipisah menjadi dua filter 1-D (baris lalu kolom) sehingga jauh lebih cepat, (4) kuat secara teori (dasar scale-space).

5. Median filter (slide 11)

Pada setiap posisi, ambil semua piksel dalam jendela, urutkan, lalu pakai nilai tengahnya. Tidak ada koefisien, jadi ini filter non-linear.

Salt-and-pepper (titik putih/hitam ekstrem): Gaussian hanya menyebar noise jadi bercak abu; median menghapusnya dengan tepi tetap tajam.

Contoh hitungan satu piksel (ada 1 piksel noise bernilai 255)

525561
6325570
615960
Box (rata-rata) = 736/9 = 81.8
Gaussian 3×3 = 100.2
Median = urut 52,55,59,60,61,61,63,70,255 → 61

Rata-rata dan Gaussian "terseret" ke atas oleh nilai 255 (hasil ±82), padahal tetangganya sekitar 60. Median tetap 61, nilai yang wajar. Median kebal terhadap outlier; rata-rata tidak.

Kritis: median tidak selalu menang. Untuk noise Gaussian (acak halus di semua piksel), filter rata-rata/Gaussian biasanya lebih baik. Median pada jendela besar juga bisa menghapus garis tipis dan sudut tajam, dan lebih lambat karena perlu pengurutan.

6. Highpass: penajam (slide 12-15)

Highpass menonjolkan perubahan cepat (tepi, detail). Dasarnya turunan: area rata → turunan 0; ada perubahan → turunan besar. Karena itu jumlah koefisien kernel turunan = 0 (slide 14), berlawanan dengan lowpass yang berjumlah 1.

6.1 Turunan kedua: Laplacian (Gambar 3.52)

010
1-41
010
111
1-81
111
-0-1-0
-14-1
-0-1-0
-1-1-1
-18-1
-1-1-1

Laplacian ∇²f = ∂²f/∂x² + ∂²f/∂y² mengukur "seberapa beda piksel dari tetangganya". Kernel kiri hanya melihat 4 tetangga; kernel -8 juga melihat diagonal sehingga responsnya lebih ke segala arah.

Rumus penajaman (Pers. 3.63): g(x,y) = f(x,y) + c·∇²f(x,y)

Aturan tanda c: bila koefisien pusat kernel negatif (−4 atau −8), pakai c = −1; bila positif, pakai c = +1. Salah tanda = citra malah jadi "terbakar"/rusak, bukan lebih tajam.
Alur: citra buram → Laplacian (hanya tepinya, hampir hitam) → citra asli dikurangi Laplacian = lebih tajam. Kernel -8 (diagonal ikut) biasanya sedikit lebih tajam.

Contoh pada patch P di atas: Laplacian di tengah = 63+55+70+59 − 4×255 = -773 (sangat negatif karena piksel jauh lebih terang dari tetangganya). Dengan c = −1, hasil = 255 − (−773) = lebih terang lagi, yaitu tepi/titik itu makin menonjol.

Kritis: penajaman juga memperkuat noise, karena noise adalah perubahan cepat. Praktiknya, citra sering di-blur ringan dulu, baru ditajamkan. Hasil penajaman juga bisa melewati 0-255, perlu di-clip.

6.2 Turunan pertama: gradien (Gambar 3.56-3.57)

∇f = [gx, gy] adalah vektor arah perubahan terbesar. Besarnya M = √(gx²+gy²) (sering didekati |gx|+|gy| agar hitungan cepat). Operator: Roberts (2×2, cepat tapi sensitif noise & kurang simetris) dan Sobel (3×3, ada bobot 2 di tengah sehingga sekaligus sedikit menghaluskan noise, jadi lebih populer).

Sobel (baris)
-1-2-1
000
121
Sobel (kolom)
-101
-202
-101

Contoh patch tepi vertikal (kiri gelap 10, kanan terang 200):

1010200
1010200
1010200
kernel kolom → 760 (tepi terdeteksi kuat)
kernel baris → 0 (tidak ada tepi horizontal)
M = 760
Magnitudo gradien Sobel: hanya tepi yang menyala, area rata menjadi hitam. Mirip contoh lensa kontak (Gambar 3.57).
LaplacianGradien (Sobel)
Turunan ke-2, tidak punya arahTurunan ke-1, punya besar & arah
Sangat sensitif noiseLebih tahan noise
Bagus untuk detail halus & penajamanBagus untuk deteksi/penegasan tepi
Tepi dua sisi (respons +/−)Tepi tebal, satu respons

7. Semua filter dari satu lowpass (slide 16-17)

Respons ideal 1-D (Gambar 3.58). Passband = frekuensi yang lolos (nilai 1), stopband = yang ditahan (nilai 0). Frekuensi rendah = perubahan lambat, frekuensi tinggi = tepi/detail.

δ(x,y) adalah unit impulse: kernel yang bernilai 1 di pusat dan 0 di tempat lain. Memfilter dengan δ tidak mengubah citra sama sekali (filter "identitas" = meloloskan semua frekuensi).

FilterKernel spasialLogika
LowpasslpDasar
Highpasshp = δ − lpSemua − yang halus = sisanya (detail)
Bandrejectbr = lp₁ + [δ − lp₂]Tahan pita tengah: loloskan rendah (lp₁) + tinggi (hp₂)
Bandpassbp = δ − brSemua − bandreject = hanya pita tengah
Highpass diperoleh dengan mengurangkan versi buram dari citra asli. Yang tersisa hanya detail/tepi.
Bandreject dan bandpass dibuat dari dua lowpass. Syarat: cutoff lp₁ lebih rendah daripada lp₂, artinya lp₁ memakai σ spasial lebih besar (σ=6) dan lp₂ lebih kecil (σ=2,5).
Kritis (hati-hati arah σ): di domain spasial, σ besar berarti blur kuat = cutoff frekuensi rendah. Karena itu pada bandreject, lp₁ (cutoff rendah) memakai σ lebih besar daripada lp₂. Jika terbalik, pita yang ditahan tidak terbentuk. Hasil bandpass/bandreject di gambar ini bergantung pada kombinasi σ yang dipilih.

8. Catatan kritis terhadap slide

9. Cek pemahaman (klik untuk melihat jawaban)

1. Mengapa kernel biasanya berukuran ganjil?Supaya ada satu piksel pusat sebagai titik acuan hasil.
2. Kapan korelasi = konvolusi?Saat kernel simetris 180° (mis. box, Gaussian, Laplacian).
3. Mengapa box 3×3 memakai faktor 1/9?Agar jumlah bobot = 1 sehingga kecerahan rata-rata tetap.
4. Noise salt-and-pepper: Gaussian atau median? Mengapa?Median. Rata-rata ikut terseret nilai ekstrem, median mengabaikannya.
5. Jumlah koefisien kernel lowpass vs highpass/turunan?Lowpass = 1, turunan/highpass = 0.
6. Kernel Laplacian berpusat −8: c berapa?c = −1 (koefisien pusat negatif).
7. Mengapa Sobel lebih tahan noise dibanding Roberts?Kernelnya 3×3 dengan bobot 2 di tengah sehingga ada efek penghalusan.
8. Bagaimana mendapatkan highpass dari lowpass?hp = δ − lp (citra asli dikurangi versi halusnya).

Terimakasih. Selamat belajar!