Intensity Transformations

Panduan belajar lengkap berdasarkan slide Agus Harjoko (Gonzalez & Woods, Bab 3). Gambar dibuat dengan Python (numpy, matplotlib, scikit-image) dari citra buatan.

1. Gambaran besar: apa itu peningkatan citra?

Enhancement = mengubah citra agar lebih berguna untuk keperluan tertentu. Kata kuncinya keperluan tertentu: citra yang bagus untuk dokter belum tentu bagus untuk algoritma deteksi tepi. Karena itu slide menyebut enhancement sebagai kumpulan trik ad hoc, tidak ada teori umum yang menjamin hasil "terbaik".

Spatial domain artinya kita mengubah nilai piksel langsung. Lawannya transform domain (misalnya Fourier), di mana citra diubah dulu ke domain frekuensi.

CaraFungsi T bergantung padaContoh
Data independentHanya nilai piksel itu sendiri; rumus tetapNegatif, log, gamma, slicing
Data dependentIsi seluruh citra (histogram)Histogram equalization, matching

Semua metode di bab ini berbentuk s = T(r): r intensitas lama, s intensitas baru, dihitung piksel demi piksel tanpa melihat tetangga. Itu kekuatannya (cepat, sederhana) sekaligus keterbatasannya (tidak bisa memakai informasi tetangga; itu tugas spatial filtering, bab berikutnya).

L = jumlah level keabuan. Citra 8-bit punya L = 256 (nilai 0 sampai 255), jadi L − 1 = 255 = putih.

Contoh dua fungsi dasar (Fig 3.2)

Contrast stretching: kurva berbentuk S yang menggelapkan nilai di bawah k dan menerangkan nilai di atasnya, sehingga selisih gelap-terang makin besar. Thresholding: kasus ekstrem, semua piksel < k jadi hitam dan ≥ k jadi putih (citra biner).

2. Transformasi dasar: negatif, log, gamma

Bentuk kurva transformasi dasar (mirip Fig 3.3)
Bentuk kurva transformasi dasar (mirip Fig 3.3)

Cara membaca grafik: sumbu x = nilai lama, sumbu y = nilai baru. Di atas garis diagonal (identitas) berarti piksel jadi lebih terang, di bawah diagonal berarti lebih gelap. Kemiringan kurva = seberapa banyak perbedaan diperbesar di daerah itu.

2.1 Negatif   s = L − 1 − r

Hitam jadi putih dan sebaliknya. Contoh: r = 30 → s = 225. Berguna untuk detail putih/abu-abu di latar gelap (mammogram, Fig 3.4), karena mata lebih mudah melihat detail gelap di latar terang daripada sebaliknya.

2.2 Log   s = c · log(1 + r)

Kurva log sangat curam di nilai rendah: rentang gelap yang sempit dilebarkan, rentang terang dimampatkan. Contoh klasik: spektrum Fourier (Fig 3.5) yang rentang nilainya sangat besar (misalnya 0 sampai jutaan), sehingga tanpa log hanya satu titik terang yang tampak. Mengapa 1 + r? Karena log(0) tidak terdefinisi. Konstanta c menskalakan hasil ke rentang tampilan.

Kebalikannya, inverse log (eksponensial), memampatkan nilai gelap dan melebarkan nilai terang.

2.3 Power-law (gamma)   s = c · rγ

Keluarga kurva gamma, c=1 (mirip Fig 3.6)
Keluarga kurva gamma, c=1 (mirip Fig 3.6)
γEfekMirip
< 1Lebih terang, gelap dilebarkanLog
= 1Tidak berubahIdentitas
> 1Lebih gelap, terang dilebarkanInverse log

Catatan penting: rumus gamma bekerja pada r yang sudah dinormalkan ke [0, 1]. Jika r masih 0..255, angkanya meledak. Praktiknya: r/255 → pangkatkan → kali 255.

Dua kegunaan gamma:

  1. Koreksi gamma tampilan (Fig 3.7). Monitor secara fisik menampilkan cahaya dengan kurva pangkat (kira-kira γ ≈ 2,5), sehingga gambar tampak terlalu gelap. Solusinya: pre-koreksi dengan γ = 1/2,5 = 0,4 sebelum ditampilkan. Dua kurva yang saling membalik akan saling menghapus.
  2. Peningkatan kontras. MRI tulang belakang terlalu gelap diberi γ = 0,6; 0,4; 0,3 (Fig 3.8). Citra udara yang terlalu terang (washed out) diberi γ = 3, 4, 5 (Fig 3.9).
Efek tiap transformasi pada citra gelap buatan
Efek tiap transformasi pada citra gelap buatan

3. Piecewise linear, slicing, dan bit-plane

3.1 Contrast stretching (piecewise linear)

Kurva dibuat dari beberapa ruas garis dengan titik kontrol (r₁, s₁) dan (r₂, s₂). Idenya: citra kontras rendah hanya memakai sebagian kecil rentang 0..255 (misalnya 100 sampai 160). Kita regangkan rentang itu menjadi 0..255.

Contrast stretching vs thresholding (mirip Fig 3.10)
Contrast stretching vs thresholding (mirip Fig 3.10)

Kelebihan dibanding fungsi kurva mulus: bentuknya bebas diatur oleh kita. Kekurangannya: butuh parameter manual, dan nilai di luar [r₁, r₂] bisa terpotong (clipping) sehingga detail di sana hilang.

3.2 Intensity-level slicing

Menonjolkan rentang tertentu [A, B], misalnya untuk menyorot jaringan dengan kepadatan tertentu atau massa air pada citra satelit. Dua versi (Fig 3.11): (a) rentang [A, B] dibuat putih, sisanya diturunkan ke level rendah (hasil biner, latar hilang); (b) rentang [A, B] disorot, sisanya dibiarkan (konteks tetap terlihat).

Intensity-level slicing, A=150 B=255 (mirip Fig 3.11)
Intensity-level slicing, A=150 B=255 (mirip Fig 3.11)

3.3 Bit-plane slicing

Satu piksel 8-bit adalah 8 angka biner. Bit ke-8 (MSB) bernilai 128, bit ke-1 (LSB) bernilai 1. Setiap bit-plane adalah citra biner.

Contoh: piksel 200 = 11001000₂. Bit 8, 7, dan 4 bernilai 1: 128 + 64 + 8 = 200.

Delapan bit-plane. Plane atas memuat struktur, plane bawah mirip noise (mirip Fig 3.14)
Delapan bit-plane. Plane atas memuat struktur, plane bawah mirip noise (mirip Fig 3.14)

Perhatikan: plane atas (8, 7, 6) memuat bentuk dan struktur, plane bawah tampak seperti noise acak. Maka rekonstruksi dari beberapa plane teratas sudah mirip citra asli:

Rekonstruksi dari bit-plane teratas saja (mirip Fig 3.15)
Rekonstruksi dari bit-plane teratas saja (mirip Fig 3.15)

Kegunaan: kompresi (buang plane bawah, hemat 4 bit per piksel dengan penurunan kualitas terbatas) dan analisis kontribusi tiap bit terhadap citra.

4. Histogram dan Histogram Equalization

4.1 Apa itu histogram citra?

Histogram menghitung berapa banyak piksel untuk tiap level keabuan. Sumbu x = level rk (0 sampai L−1), sumbu y = jumlah.

Asumsi tersembunyi dari slide: tiap piksel diambil independen dari PDF yang sama (i.i.d.). Dalam kenyataan piksel bertetangga sangat berkorelasi, jadi histogram tidak menyimpan informasi posisi. Dua citra yang sangat berbeda bisa punya histogram sama.

Empat tipe citra dan histogramnya (mirip Fig 3.16)
Empat tipe citra dan histogramnya (mirip Fig 3.16)
TipeCiri histogram
GelapMenumpuk di kiri
TerangMenumpuk di kanan
Kontras rendahSempit, di tengah
Kontras tinggiMenyebar luas ke seluruh rentang

4.2 Mengapa kontras rendah itu masalah?

Detail penting tersembunyi, sulit dibaca mata, dan menyulitkan algoritma computer vision (deteksi fitur, segmentasi). Pada rontgen atau CT, perbedaan halus bisa menentukan diagnosis.

4.3 Ide Histogram Equalization (HE)

Target: membuat histogram hasil sedekat mungkin ke seragam, sehingga semua level dipakai kira-kira sama banyak. Cara kerjanya: sebar level yang paling sering muncul. Fungsi yang melakukannya ternyata adalah CDF (distribusi kumulatif) dari citra itu sendiri:

s = T(r) = (L − 1) ∫₀ʳ pr(w) dw

Intuisi: level yang berisi banyak piksel punya CDF yang naik curam, sehingga level itu diregangkan lebar. Level yang jarang muncul dimampatkan. Hasilnya: kontras bertambah di tempat piksel paling banyak berkumpul.

Syarat matematis: T harus monoton naik (urutan gelap-terang tidak boleh terbalik) dan s tetap di [0, L−1] (Fig 3.17). Slide membedakan monoton tidak ketat (beberapa r bisa jadi satu s, tidak bisa dibalik) dan ketat (satu-satu, bisa dibalik).

4.4 Versi diskrit (yang dipakai praktik)

sk = round[ (L − 1) · CDF(rk) ] = round[ (L − 1)/N · Σ nw ]

Integral diganti penjumlahan, hasil dibulatkan ke bilangan bulat terdekat.

4.5 Latihan hitung manual (slide 28)

Citra 5×5, L = 4 (level 0 sampai 3), N = 25:

00112
12301
33220
23100
11322
rnp(r)CDF(L−1) × CDFs (dibulatkan)
066/256/253 × 0.24 = 0.721
177/2513/253 × 0.52 = 1.562
277/2520/253 × 0.80 = 2.402
355/2525/253 × 1.00 = 3.003

Langkah: (1) hitung jumlah tiap level, (2) bagi 25 jadi p, (3) jumlahkan kumulatif jadi CDF, (4) kali 3, (5) bulatkan, (6) ganti tiap piksel. Hasil:

11222
22312
33221
23211
22322

Perhatikan: r=1 dan r=2 sama-sama menjadi 2, jadi dua level asli bergabung. Level 0 (paling gelap) naik menjadi 1, sehingga tidak ada lagi piksel bernilai 0. Itulah mengapa slide mengatakan citra ini sudah hampir rata dan efeknya tidak jelas.

Histogram equalization pada citra gelap
Histogram equalization pada citra gelap

5. HE lanjutan: Global HE, AHE, CLAHE

Bagian ini adalah rantai masalah dan solusi. Pahami urutannya.

  1. Global HE memakai satu transformasi untuk seluruh citra. Masalah: noise di area seragam (langit, dinding) ikut diperkuat. Area yang sudah terang bisa menjadi "blown-out". Contoh: langit terang + latar depan gelap, HE akan membuat langit terlalu putih demi memunculkan detail latar depan.
  2. AHE (Adaptive HE) membagi citra menjadi tile (kotak kecil) tak tumpang tindih dan menjalankan HE di tiap tile. Agar tidak terlihat garis batas antar-tile, hasil digabung dengan interpolasi bilinear. Masalah baru: di tile yang hampir seragam, histogramnya sempit dan tinggi; meregangkannya membuat noise kecil jadi tampak besar.
  3. CLAHE (Contrast Limited AHE) menambahkan batas kontras (clip limit): bin histogram yang melebihi batas dipotong, kelebihannya dibagi rata ke semua bin, baru di-equalize. Karena kemiringan CDF dibatasi, penguatan kontras dan noise terkendali.

Langkah CLAHE

  1. Bagi citra menjadi tile persegi panjang.
  2. Hitung histogram tiap tile.
  3. Clip histogram dan redistribusi kelebihannya.
  4. Equalize histogram yang sudah di-clip.
  5. Interpolasi bilinear antar-tile untuk menghilangkan artefak grid.
Global HEAHECLAHE
KelebihanSederhana, cepatBagus untuk kontras lokalKontras lokal bagus, noise terbatas
KekuranganNoise di area seragam, abaikan kontras lokalMemperkuat noiseLebih berat dihitung, ada parameter (clip limit, ukuran tile)
Perbandingan HE global dan CLAHE (skimage). Clip besar mendekati AHE, clip kecil lebih terkendali
Perbandingan HE global dan CLAHE (skimage). Clip besar mendekati AHE, clip kecil lebih terkendali

Local histogram processing (Fig 3.32)

Prinsip yang sama dengan AHE: hitung histogram di jendela kecil yang digeser piksel demi piksel. Pada contoh slide, HE global gagal memunculkan kotak kecil dan huruf "a" yang tersembunyi di area gelap, sedangkan HE lokal berhasil memunculkannya, tetapi juga memperkuat noise di latar.

6. Histogram specification (matching)

HE selalu menargetkan histogram seragam. Padahal kadang seragam bukan yang terbaik (misalnya citra yang ingin dibuat bernuansa gelap seperti citra lain). Histogram matching adalah generalisasi HE: histogram hasil dipaksa mengikuti PDF target pz(z) yang kita pilih. Contoh pada slide: histogram foto Lena diubah mengikuti histogram foto lain, sehingga warna dan kecerahannya ikut berubah.

Idea dasar: cari z = T(r) sehingga P(Z ≤ z) = P(R ≤ r), artinya CDF-nya cocok.

Metode tidak langsung (slide 38)

  1. Equalize citra input: s = T(r).
  2. Equalize histogram target: v = G(z).
  3. Samakan v = s. Kebalikannya memberi

    z = G⁻¹( T(r) )

Dengan kata lain: "ratakan dulu citra, lalu 'tidak-ratakan' sesuai target". Bayangkan dua peringkat: piksel yang berada di persentil ke-70 pada citra input dipetakan ke nilai yang berada di persentil ke-70 pada histogram target.

Histogram matching: input gelap dipaksa mengikuti pdf target
Histogram matching: input gelap dipaksa mengikuti pdf target

7. Ringkasan, perbandingan, dan latihan

MetodeRumus/IdeCocok untukKelemahan
NegatifL−1−rDetail terang di latar gelapTidak menambah kontras
Logc·log(1+r)Rentang dinamis sangat lebar, area gelapArea terang dimampatkan
Gammac·rγKoreksi monitor, kontrasγ dipilih manual
Contrast stretchingKurva piecewiseKontras rendahParameter manual, bisa clipping
SlicingSorot [A,B]Fokus ke rentang intensitas tertentuPilih A, B manual
Bit-planePisah bitKompresi, analisisBit rendah belum tentu noise
HEs=(L−1)·CDFKontras global otomatisNoise, tidak natural
AHE / CLAHEHE per tile (+clip)Kontras lokalParameter tile dan clip
Matchingz=G⁻¹(T(r))Histogram target tertentuInvers tak unik

Cek pemahaman (klik untuk melihat jawaban)

1. Apa beda data independent dan data dependent?

Data independent: fungsi T tetap, tidak melihat isi citra (negatif, log, gamma). Data dependent: T dihitung dari histogram citra (HE).

2. Citra terlalu gelap. Pilih γ < 1 atau > 1?

γ < 1: kurva di atas diagonal, nilai gelap dilebarkan sehingga citra lebih terang.

3. Monitor punya gamma 2,5. Berapa γ koreksinya?

1/2,5 = 0,4.

4. Mengapa log memakai 1 + r?

Karena log(0) tidak terdefinisi; dengan 1 + r, piksel hitam (0) menjadi log(1) = 0.

5. Piksel bernilai 200: tulis bit-plane-nya.

200 = 11001000₂ (bit 8, 7, dan 4 bernilai 1).

6. Mengapa HE diskrit tidak menghasilkan histogram rata sempurna?

Piksel satu level tidak bisa dipecah ke level berbeda, dan hasilnya dibulatkan; beberapa level bergabung.

7. Apa yang ditambahkan CLAHE dibanding AHE?

Batas kontras (clipping): bin di atas batas dipotong dan kelebihannya dibagi rata, sehingga noise tidak terlalu diperkuat.

8. Tuliskan transformasi histogram matching.

z = G⁻¹(T(r)): T = equalization citra input, G = equalization histogram target.

9. Hitung HE: L=8, n = [2,3,5,0,10,4,0,0] (N=24). Berapa s untuk r=0 dan r=2?

CDF: 2, 5, 10, 10, 20, 24, 24, 24. s = round(7 × CDF/24): r=0 → round(0,58) = 1; r=2 → round(2,92) = 3.

Praktik dengan Python

import cv2
img = cv2.imread("foto.jpg", 0)                    # grayscale
neg  = 255 - img
log  = (255*np.log1p(img)/np.log1p(img.max())).astype('uint8')
gam  = (255*(img/255.0)**0.5).astype('uint8')
he   = cv2.equalizeHist(img)
cl   = cv2.createCLAHE(2.0,(8,8)).apply(img)
# matching: skimage.exposure.match_histograms(img, referensi)

Hal lanjut: slide menutup dengan "Next: Spatial Filtering", yaitu transformasi yang melihat tetangga piksel (blur, sharpening, deteksi tepi).