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.

OperasiRumusArti singkat
ErosiA ⊖ Bobjek menyusut
DilasiA ⊕ Bobjek membesar
Opening(A ⊖ B) ⊕ Bbuang noise & jembatan tipis
Closing(A ⊕ B) ⊖ Btutup 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ᶜ.

NotasiBahasa sehari-hari
ω ∈ Ωω anggota himpunan Ω
A ⊂ Bsemua anggota A juga ada di B
Aᶜsemua titik yang bukan A (background)
A ∪ Bada di A atau B (gabungan)
A ∩ Bada 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

Translasi: (A)z = { c | c = a + z, a ∈ A }
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?"

A ⊖ B = { z | (B)z ⊆ A }

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?"

A ⊕ B = { z | (B̂)z ∩ A ≠ ∅ }

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).

gambar

Perhatikan: pada erosi noise bintik hilang, tetapi objek juga menyusut dan lubang melebar. Pada dilasi noise justru ikut membesar dan lubang tertutup.

Sifat duality

(A ⊖ B)ᶜ = Aᶜ ⊕ B̂    (A ⊕ B)ᶜ = Aᶜ ⊖ B̂

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

Opening: A ∘ B = (A ⊖ B) ⊕ B
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.

gambar

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.

I ⊛ B = (A ⊖ B₁) ∩ (Aᶜ ⊖ B₂)

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.

gambar

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)

β(A) = A − (A ⊖ B)

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)

Xk = (Xk−1 ⊕ B) ∩ Iᶜ,   k = 1, 2, 3, …

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.

gambar

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)

Xk = (Xk−1 ⊕ B) ∩ I

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.

gambar

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)

A ⊗ B = A − (A ⊛ B)

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.

(A ⊖ kB) = k kali erosi berturut-turut
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.

gambar

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):

  1. Thinning berulang dengan SE end-point (X₁ = A ⊗ {B}) sebagai pemangkas ujung; tiga siklus cukup untuk membuang duri pendek.
  2. Cari ujung (end points) pada hasil X₁ dengan hit-or-miss.
  3. Dilasi bersyarat end point, dibatasi oleh A asli, agar ujung cabang yang benar tumbuh kembali.
  4. 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

TugasAlatCatatan penting
Hapus noise titikOpeningSE > ukuran noise
Tutup celah/lubang kecilClosingSE > lebar celah
Batas objekA − (A ⊖ B)SE 3×3 → tebal 1 piksel
Isi lubangDilasi ∩ IᶜPerlu seed, SE plus
Hitung/pisahkan objekDilasi ∩ ITentukan 4/8 konektivitas
Cari polaHit-or-miss1 / 0 / X (don't care)
KerangkaSkeleton / thinningSmoothing 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).

9. Latihan mandiri

1. Mengapa opening menghapus noise tapi tidak mengecilkan objek besar secara permanen?Erosi menghapus noise lalu menyusutkan objek; dilasi mengembalikan ukuran objek yang tersisa. Noise yang sudah hilang tidak punya "benih" untuk tumbuh lagi.
2. Citra berisi dua kotak yang terhubung garis tipis 3 piksel. Cara memisahkannya?Opening dengan SE 5×5 (lebih lebar dari garis), atau erosi lalu connected components. Ukuran SE harus lebih besar dari tebal penghubung dan lebih kecil dari kotak.
3. Apa beda hole filling dan connected components secara rumus?Hanya pembatasnya: Iᶜ untuk hole filling, I untuk connected components.
4. Apa yang terjadi jika SE hit-or-miss semuanya don't care?Semua posisi cocok, sehingga hasilnya tidak informatif. Pola harus punya cukup piksel 1 dan 0 agar spesifik.
5. Kerjakan manual: grid 5×5 dengan blok foreground 3×3 di tengah, SE 3×3. Hasil erosi dan dilasi?Erosi: 1 piksel di tengah. Dilasi: blok 5×5 penuh.