Morphological Image Processing: Citra Biner
Panduan belajar dari slide V7 (buku Gonzalez & Woods, Digital Image Processing, Bab 9). Gambar di bawah dibuat dengan Python (NumPy, SciPy, Matplotlib) pada citra contoh yang sama, jadi Anda bisa membandingkan efek tiap operasi secara langsung. Piksel hitam = foreground (nilai 1), putih = background (0).
0. Peta besar
Morfologi artinya ilmu tentang bentuk. Dalam pengolahan citra, morfologi matematis memakai teori himpunan untuk memproses bentuk objek: batas, kerangka (skeleton), convex hull, dan lain-lain.
Ide utamanya sederhana: ambil "stempel" kecil bernama structuring element (SE), geser ke seluruh citra, lalu pada tiap posisi tanyakan "apakah stempel ini cocok dengan objek?" Jawaban atas pertanyaan itu menghasilkan citra baru.
| Operasi | Rumus | Arti singkat |
|---|---|---|
| Erosi | A ⊖ B | objek menyusut |
| Dilasi | A ⊕ B | objek membesar |
| Opening | (A ⊖ B) ⊕ B | buang noise & jembatan tipis |
| Closing | (A ⊕ B) ⊖ B | tutup celah & lubang kecil |
| Hit-or-miss | (A ⊖ B₁) ∩ (Aᶜ ⊖ B₂) | cari pola bentuk persis |
Semua operasi lanjutan (batas, hole filling, skeleton, dst.) hanyalah kombinasi operasi di atas. Kuasai erosi dan dilasi, sisanya mengikuti.
1. Fondasi: teori himpunan
Citra biner = himpunan A yang berisi koordinat semua piksel foreground. Background adalah komplemen Aᶜ.
| Notasi | Bahasa sehari-hari |
|---|---|
| ω ∈ Ω | ω anggota himpunan Ω |
| A ⊂ B | semua anggota A juga ada di B |
| Aᶜ | semua titik yang bukan A (background) |
| A ∪ B | ada di A atau B (gabungan) |
| A ∩ B | ada di A dan B (irisan) |
| A − B = A ∩ Bᶜ | anggota A yang bukan anggota B |
| A ∩ B = ∅ | A dan B saling lepas |
Kritis: A − B ≠ B − A. Urutan penting. Ini nanti muncul di rumus batas β(A) = A − (A ⊖ B).
Translasi dan refleksi
Refleksi: B̂ = { w | w = −b, b ∈ B }
Translasi = menggeser seluruh bentuk sejauh vektor z (ini yang dilakukan saat SE "berjalan" di citra). Refleksi = memutar 180° terhadap origin. Jika SE simetris (kotak, lingkaran), B̂ = B sehingga refleksi tidak berpengaruh. Itulah sebabnya pada banyak contoh Anda bisa mengabaikannya.
Operasi logika antar citra
NOT membalik hitam-putih. AND = hanya piksel yang foreground di kedua citra. OR = foreground di salah satu. XOR = foreground di salah satu tetapi tidak keduanya. NOT-AND = [NOT(A)] AND B, yakni bagian B yang tidak tertutup A. Operasi ini sama dengan ∩, ∪, komplemen, dan selisih pada himpunan.
2. Structuring element, erosi, dilasi
Structuring element (SE)
SE adalah matriks kecil (mis. 3×3 berisi 1) dengan satu titik origin (biasanya tengah). Bentuk dan ukuran SE menentukan hasil. SE persegi menghaluskan ke segala arah, SE memanjang (garis) hanya berpengaruh pada satu arah (Fig 9.4d, 9.6d di slide).
Erosi: "apakah SE muat sepenuhnya di dalam objek?"
Letakkan origin SE di titik z. Jika seluruh SE berada di dalam A, titik z lolos. Akibatnya objek menyusut, titik/garis yang lebih kecil dari SE hilang, dan lubang membesar.
Dilasi: "apakah SE menyentuh objek?"
Titik z lolos jika SE (yang direfleksikan) beririsan dengan A minimal di satu piksel. Akibatnya objek menebal, celah sempit tertutup, dan lubang mengecil. Pada slide, dilasi dipakai untuk menyambung huruf yang putus (Fig 9.7).
Perhatikan: pada erosi noise bintik hilang, tetapi objek juga menyusut dan lubang melebar. Pada dilasi noise justru ikut membesar dan lubang tertutup.
Sifat duality
Mengerosi objek sama dengan mendilasi background-nya lalu membalik hasilnya. Praktisnya, cukup satu algoritma yang diimplementasikan; yang satunya didapat lewat komplemen.
Kritis: (1) Erosi dan dilasi bukan kebalikan. Erosi lalu dilasi tidak mengembalikan citra asli: detail yang sudah hilang tidak kembali. Itulah dasar opening. (2) Pada Fig 9.5, SE 11×11, 15×15, 45×45 menghapus kawat dengan ketebalan lebih kecil dari SE. Semakin besar SE, semakin banyak yang hilang, termasuk bagian penting objek. (3) Pinggir citra: SciPy/MATLAB punya aturan padding berbeda, sehingga hasil di tepi bisa berlainan.
3. Opening dan closing
Closing: A • B = (A ⊕ B) ⊖ B
Opening = erosi dulu, dilasi kemudian. Bayangkan bola menggelinding di dalam objek: bagian yang tidak bisa dijangkau bola (ujung runcing, jembatan tipis, noise) terbuang. Kontur jadi halus, ukuran objek kurang lebih tetap.
Closing = dilasi dulu, erosi kemudian. Bola menggelinding di luar objek: celah sempit dan lubang kecil yang tidak bisa dimasuki bola tertutup.
Perhatikan panel terakhir: SE 5×5 memutus jembatan tebal 4 piksel, sedangkan SE 3×3 tidak. Ukuran SE harus dipilih sesuai ukuran struktur yang ingin dibuang.
Filtering (Fig 9.11, sidik jari): opening dulu menghapus bintik putih noise, lalu closing menutup retakan kecil pada garis. Urutan opening → closing umum dipakai untuk noise jenis "garam dan merica" pada citra biner.
Kritis: Opening dan closing bersifat idempoten: mengulanginya dengan SE yang sama tidak mengubah apa pun lagi. Namun opening→closing tidak sama dengan closing→opening, dan bisa mengubah bentuk (sudut tajam asli ikut membulat). Bila bentuk objek harus presisi, hati-hati.
4. Hit-or-miss transform
Tujuan: menemukan pola persis (objek dengan ukuran/bentuk tertentu), karena erosi biasa hanya mengecek "muat", bukan "cocok persis". Solusinya memakai dua SE: B₁ untuk foreground dan B₂ untuk background di sekelilingnya.
Pada Fig 9.12, objek D (persegi d×d) ditemukan karena hanya D yang cocok sekaligus dengan B₁ (isi kotak) dan B₂ (bingkai background). Dengan SE gabungan satu matriks: 1 = harus foreground, 0 = harus background, X = tidak peduli (di MATLAB: +1, −1, 0). Keluaran bernilai 1 hanya jika semua piksel non-don't-care cocok.
Panel tengah: hit-or-miss dengan pusat = foreground dan 8 tetangga = background menemukan piksel noise yang menyendiri. Ini juga dasar deteksi sudut dan lubang 1 piksel (Fig 9.14).
Kritis: Hit-or-miss sangat sensitif: satu piksel noise di sekitar pola membuatnya gagal. Don't-care membuatnya lebih toleran. Pola yang berubah ukuran atau berputar perlu SE tersendiri untuk tiap variasi.
5. Aplikasi dasar
5.1 Boundary extraction (ekstraksi batas)
Erosi mengikis lapisan terluar objek; mengurangkannya dari A menyisakan lapisan itu, yaitu batas (lihat panel kanan gambar sebelumnya). SE 3×3 menghasilkan batas setebal 1 piksel. SE lebih besar menghasilkan batas lebih tebal.
5.2 Hole filling (pengisian lubang)
Mulai dari satu piksel di dalam lubang (X₀), lalu dilasi terus. Pembatas Iᶜ menjaga "air" tidak tumpah keluar dari lubang. Berhenti saat Xk = Xk−1; gabungkan hasilnya dengan A. SE yang dipakai berbentuk tanda plus (4-konektivitas), bukan kotak penuh.
Hanya lubang yang diberi titik awal yang terisi; lubang lain tetap. Di Fig 9.18 slide, setiap lubang diberi titik awal.
Kritis: Algoritma ini membutuhkan seed manual. Di praktik, seed bisa diganti dengan cara otomatis (mis. isi dari tepi citra, lalu lubang = bagian yang tak terjangkau), seperti binary_fill_holes. Mengapa SE plus? Dengan SE kotak penuh, "air" bisa bocor lewat celah diagonal pada dinding objek.
5.3 Connected components (komponen terhubung)
Sama seperti hole filling, tetapi dibatasi oleh I (objek) bukan Iᶜ. Mulai dari satu titik di objek, dilasi terus, dan hasil mentok di tepi objek tersebut: ia menjelajahi seluruh komponen yang terhubung dengannya. Ulangi dengan seed baru untuk komponen lain.
Aplikasi (Fig 9.20): X-ray fillet ayam → threshold → erosi (hapus noise) → hitung komponen → komponen dengan jumlah piksel besar (743, 674) dicurigai sebagai tulang, yang kecil diabaikan.
Kritis: Hasil bergantung pada definisi konektivitas: 4-tetangga atau 8-tetangga. Dua piksel yang bersentuhan diagonal terhitung satu komponen pada 8-konektivitas, tetapi dua komponen pada 4-konektivitas. Selain itu, pada contoh tulang, erosi bisa saja menghapus serpihan tulang yang benar-benar kecil, jadi pilihan SE memengaruhi keputusan.
6. Convex hull, thinning, thickening
Convex hull
Himpunan A cembung jika garis lurus antara dua titik mana pun di A seluruhnya ada di A. Convex hull = himpunan cembung terkecil yang memuat A (seperti karet gelang melingkari objek). Algoritma: untuk i = 1…4, ulangi Xki = (Xk−1i ⊛ Bi) ∪ Xk−1i sampai konvergen, dengan 4 SE yang menghadap 4 arah; hasil keempatnya digabung (∪) menjadi C(A).
Kritis: Hull versi ini hanya "cembung" terhadap 4 arah (atas, bawah, kiri, kanan) sehingga hasilnya persegi-ish, bukan poligon cembung sempurna. Slide juga tidak membahas pembatasan agar hull tidak melebar berlebihan.
Thinning (penipisan)
Hapus dari A semua piksel yang cocok dengan pola SE (hit-or-miss). Dipakai 8 SE yang berputar (B¹…B⁸) secara berurutan dan diulang sampai tidak ada lagi perubahan (Fig 9.23). Hasil akhir: garis setebal 1 piksel yang mempertahankan bentuk dan konektivitas objek. Setelah konvergen hasil biasa dikonversi ke m-connectivity untuk membuang piksel sudut berlebih.
Thickening (penebalan)
Kebalikan thinning (dual): thinning pada komplemen A, lalu komplemen lagi. Praktis, thickening sering dilewati karena dilasi bersyarat lebih mudah; slide mencatat hasil akhirnya tanpa titik terputus (Fig 9.24).
7. Skeleton dan pruning
Skeleton
Maximum disk = lingkaran terbesar yang masih berada di dalam A dan tidak bisa dimuat lingkaran lain yang juga di dalam A. Skeleton = kumpulan pusat semua maximum disk: "tulang punggung" objek.
Sk(A) = (A ⊖ kB) − (A ⊖ kB) ∘ B
K = max{ k | (A ⊖ kB) ≠ ∅ }
S(A) = ∪k=0..K Sk(A)
Rekonstruksi: A = ∪k=0..K ( Sk(A) ⊕ kB )
Cara bacanya: pada setiap tahap k, erosi A sebanyak k kali, lalu simpan bagian yang hilang saat di-opening (ujung/tonjolan yang tidak muat dibangun ulang). Bagian itu adalah potongan skeleton level k. Gabungkan semua level.
Nilai plus skeleton: ia lossless. Dengan menyimpan Sk dan k, objek asli bisa direkonstruksi persis (kolom 5-6 Fig 9.26). Jadi skeleton juga berfungsi sebagai kompresi bentuk.
Kritis: Skeleton morfologis tidak dijamin terhubung dan tidak selalu setebal 1 piksel, berbeda dengan hasil thinning. Selain itu skeleton sangat sensitif terhadap noise pada batas: satu tonjolan kecil menciptakan cabang baru. Karena itu orang melakukan smoothing (opening/closing) dulu, lalu pruning.
Pruning (pemangkasan cabang)
Thinning/skeleton menyisakan cabang pendek ("duri") akibat noise. Pruning membuangnya dalam 4 langkah (Fig 9.27):
- Thinning berulang dengan SE end-point (X₁ = A ⊗ {B}) sebagai pemangkas ujung; tiga siklus cukup untuk membuang duri pendek.
- Cari ujung (end points) pada hasil X₁ dengan hit-or-miss.
- Dilasi bersyarat end point, dibatasi oleh A asli, agar ujung cabang yang benar tumbuh kembali.
- Gabungkan hasil langkah 1 dan 3. Duri pendek hilang, cabang panjang tetap utuh.
Kritis: Jumlah siklus thinning adalah parameter manual yang menentukan panjang duri yang dibuang. Terlalu banyak = cabang sah ikut terpotong.
8. Ringkasan akhir
| Tugas | Alat | Catatan penting |
|---|---|---|
| Hapus noise titik | Opening | SE > ukuran noise |
| Tutup celah/lubang kecil | Closing | SE > lebar celah |
| Batas objek | A − (A ⊖ B) | SE 3×3 → tebal 1 piksel |
| Isi lubang | Dilasi ∩ Iᶜ | Perlu seed, SE plus |
| Hitung/pisahkan objek | Dilasi ∩ I | Tentukan 4/8 konektivitas |
| Cari pola | Hit-or-miss | 1 / 0 / X (don't care) |
| Kerangka | Skeleton / thinning | Smoothing dulu, lalu pruning |
Alur kerja khas: threshold → opening/closing (bersihkan) → connected components (pisahkan) → boundary / skeleton (ambil fitur).
Slide ini baru Bagian 1: citra biner. Sesuai Objectives, bagian berikutnya memperluas semua operasi ini ke citra grayscale (erosi = minimum lokal, dilasi = maksimum lokal).