Pengolahan Citra · Materi 04

Image Enhancement & Filtering

Menguji Gaussian, median, dan box blur pada foto dengan noise terkontrol, lalu membahas sharpening, brightness, serta histogram.

Google Colab · OpenCV · Pemahaman konsep → pengamatan → praktikum → analisis

Mode belajar: tulis kode sendiri. Copy/cut, seleksi teks dan klik kanan dibatasi pada halaman; pembatasan UI bukan jaminan anti-penyalinan mutlak.

1. Tujuan

  1. Menerapkan Gaussian blur, median blur, dan box blur dengan parameter kernel yang valid.
  2. Membandingkan pengurangan noise serta kehilangan detail pada input noise yang sama.
  3. Menerapkan sharpening dan perubahan brightness dengan perhitungan yang menghindari overflow uint8.
  4. Menafsirkan histogram intensitas dan menyusun perbandingan minimal tiga teknik filtering berdasarkan output.

Prasyarat: Memahami citra sebagai array uint8, BGR/RGB, dan cara menjalankan notebook Colab. Sel import serta upload disediakan lengkap.

2. Materi Pembahasan

Noise merupakan simulasi terkontrol; semua filter benar-benar dieksekusi.
Noise merupakan simulasi terkontrol; semua filter benar-benar dieksekusi.

2.1 Enhancement berbeda dari pemulihan sempurna

Image enhancement bertujuan membuat informasi tertentu lebih mudah dilihat atau diproses. Brightness dapat membantu melihat daerah gelap, smoothing dapat mengurangi gangguan, dan sharpening dapat mempertegas perubahan intensitas. Namun operasi tersebut tidak menciptakan bukti baru tentang objek yang tidak tertangkap kamera. Citra yang terlihat menarik belum tentu paling sesuai untuk pengukuran, segmentasi, atau pengenalan. Tetapkan tujuan sebelum memilih teknik: mengurangi bintik, mempertahankan tepi, atau memperbaiki keterbacaan tekstur.

Dalam praktikum, foto unggahan diperlakukan sebagai referensi sebelum penambahan noise. Referensi ini tidak dijamin bebas noise bawaan kamera. Noise tambahan dibuat terkontrol agar hasil filter dapat dibandingkan dengan input referensi yang sama. Label output harus menyebut penambahan noise buatan pada foto asli, bukan menyatakan bahwa foto tersebut diambil kamera dalam kondisi noise yang direkayasa.

2.2 Lingkungan pixel dan kernel smoothing

Filter spasial memanfaatkan lingkungan di sekitar setiap pixel. Box blur memberi bobot seragam pada lingkungan, sedangkan Gaussian blur memberikan bobot lebih besar pada tetangga yang dekat pusat. Keduanya mencampurkan intensitas lokal sehingga variasi cepat dapat menurun, tetapi tepi serta tekstur kecil juga dapat melemah. Ukuran kernel menentukan jangkauan pencampuran. Kernel lebih besar bukan selalu lebih baik karena objek tipis dapat menyatu dengan background.

Contoh memakai kernel 5 × 5 untuk membuat perbandingan awal mudah dibaca. Gaussian memakai sigmaX 1.2, sehingga parameter bobotnya turut dicatat. Pengolahan batas gambar ditangani library, tetapi perubahan pada daerah tepi tetap harus diperhatikan. Gunakan input, skala tampilan, dan ukuran kernel yang terdokumentasi saat membandingkan hasil; jangan membandingkan foto berbeda lalu menyimpulkan selisih berasal hanya dari algoritme.

2.3 Median dan jenis noise

Median blur mengganti nilai pixel dengan nilai tengah dari lingkungan, bukan rata-rata. Nilai impuls yang jauh lebih terang atau gelap dapat tersisih, sehingga teknik ini sering bermanfaat pada salt-and-pepper noise. Pada noise Gaussian tambahan, fluktuasi tersebar pada banyak pixel sehingga Gaussian smoothing dapat menghasilkan kompromi berbeda. Tidak ada urutan kualitas yang tetap untuk semua gambar, tingkat noise, dan tujuan pemrosesan.

Contoh membuat dua kondisi dengan random generator berseed tetap: noise Gaussian dan impuls hitam-putih. Seed membantu mengulangi eksperimen, bukan membuat algoritme lebih akurat. Kedua kondisi diterapkan pada foto sumber yang sama. Saat menguji gambar yang sudah noise dari kamera tanpa referensi bersih, evaluasi harus terutama membahas artefak, keutuhan tepi, dan tekstur; jangan menghitung kualitas pemulihan terhadap citra bersih yang sebenarnya tidak tersedia.

2.4 Sharpening dan brightness yang aman

Sharpening meningkatkan perbedaan lokal sehingga tepi terlihat lebih tegas. Contoh memakai kernel dengan pusat positif besar dan tetangga negatif pada keluaran median. Ini menunjukkan alur denoise terlebih dahulu, lalu mempertajam. Jika diterapkan langsung pada citra noise, penguatan detail juga dapat memperkuat gangguan. Efek halo dan permukaan terlalu kasar adalah tanda bahwa penajaman perlu dikurangi atau teknik lain diperlukan.

Brightness pada contoh adalah penambahan offset intensitas, bukan perbaikan pencahayaan fisik. Ubah array menjadi float sebelum operasi, batasi hasil ke rentang 0–255, lalu kembalikan ke uint8. Penambahan terlalu besar memotong nilai terang menjadi 255 sehingga informasi hilang. Sebaliknya offset negatif dapat memotong daerah gelap ke nol. Clipping mencegah wrap-around, tetapi tetap merupakan kehilangan informasi yang harus dibahas.

2.5 Histogram dan evaluasi hasil

Histogram grayscale menghitung berapa banyak pixel berada pada tiap tingkat intensitas. Distribusi yang terkumpul pada daerah gelap dapat menunjukkan foto gelap, tetapi juga bisa mencerminkan objek yang memang gelap. Equalization mendistribusikan ulang tingkat intensitas berdasarkan histogram untuk meningkatkan kontras tertentu. Praktikum menerapkannya pada grayscale agar tidak mencampurkan perubahan warna dari equalization channel BGR terpisah. Bandingkan histogram dengan tampilan citra, bukan hanya bentuk kurvanya.

MSE dihitung sebagai rata-rata kuadrat selisih terhadap referensi sebelum noise tambahan. Angka lebih kecil berarti lebih dekat menurut ukuran tersebut, bukan pasti lebih baik secara visual. Selisih dapat turun ketika citra terlalu halus, sementara detail yang penting hilang. Laporan harus menggabungkan metrik, inspeksi wilayah detail yang sama, parameter, dan alasan pemilihan filter. Simpan hasil yang tidak berhasil sebagai bagian analisis, bukan hanya hasil yang tampak terbaik.

Video pembelajaran sesuai bab

OpenCV Python Tutorial For Beginners 18 - Smoothing Images | Blurring Images OpenCV — ProgrammingKnowledge.

Fokus saat menonton: Bandingkan averaging, Gaussian, median dan bilateral: apa yang terjadi pada noise serta batas objek?

Buka video di YouTube jika pemutar tidak tersedia

Video referensi berbahasa Inggris. Bila ada setup lokal, API atau versi model berbeda, pelajari konsepnya dan tetap gunakan alur Google Colab pada praktikum bab ini. Ketersediaan pemutar mengikuti YouTube, pemilik video dan jaringan.

Referensi dan sumber ilustrasi

Foto daun: Ανώνυμος Βικιπαιδιστής, Wikimedia Commons, CC BY 3.0; diubah ukuran/intensitas untuk ilustrasi. Foto bus: contoh aset Ultralytics. Foto astronaut: NASA melalui scikit-image. Panel diagram/simulasi ditandai pada caption; bukan hasil eksperimen yang dikarang. Hak penggunaan sumber tetap mengikuti sumber asli.

3. Praktikum Google Colab

Buka Google Colab

Buat notebook baru, simpan pada Drive milik sendiri, lalu isi identitas. Gunakan sel kode terpisah untuk setiap langkah dan jalankan berurutan dengan Shift + Enter. Tidak perlu mengunduh notebook contoh atau memasang Python lokal.

Identitas di bagian paling atas notebook: tambahkan sel Text/Markdown sebelum kode dan isi Nama serta NPM.
# Materi 04 — Pengolahan Citra
Nama: [Nama lengkap mahasiswa]
NPM: [NPM mahasiswa]
Kelas: [Kelas, jika diperlukan]
  1. Buat notebook Colab mandiri; upload foto dengan detail seperti urat daun atau tekstur benda.
  2. Jalankan penambahan noise terkontrol dan pertahankan seed serta referensi yang sama.
  3. Bandingkan Gaussian, median, serta box blur pada tiap kondisi noise; catat parameter dan MSE yang benar-benar muncul.
  4. Periksa crop daerah detail yang sama pada semua hasil; crop dapat ditampilkan dengan img[y1:y2, x1:x2].
  5. Bandingkan sebelum dan sesudah sharpening, lalu jelaskan perubahan tepi dan kemungkinan penguatan gangguan.
  6. Baca histogram brightness/equalization; tulis analisis, simpan output, dan bagikan satu link Colab Viewer.

Sel 1 — 1. Import library

Ketik di notebook Colab baru setelah sel Markdown Nama dan NPM. Modul ini mandiri; tidak menggunakan variabel dari modul lain.

import cv2
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files

Sel 2 — 2. Upload satu foto

Pilih satu foto JPEG/PNG uint8, maksimum 10 MiB dan 12 juta pixel. Pembacaan mempertahankan channel asli untuk validasi, lalu menyiapkan BGR tiga channel. PNG transparan tidak dipakai agar tidak ada background tersembunyi.

uploaded = files.upload()
if len(uploaded) != 1:
    raise ValueError("Pilih tepat satu foto JPEG/PNG.")
nama, data = next(iter(uploaded.items()))
if not nama.lower().endswith((".jpg", ".jpeg", ".png")):
    raise ValueError("Gunakan file JPEG atau PNG.")
if not data or len(data) > 10 * 1024 * 1024:
    raise ValueError("File kosong atau melebihi 10 MiB.")
raw = cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_UNCHANGED)
if raw is None:
    raise ValueError("File tidak dapat didecode sebagai gambar.")
h, w = raw.shape[:2]
if h * w > 12_000_000 or min(h, w) < 32 or raw.dtype != np.uint8:
    raise ValueError("Gunakan gambar uint8, sisi minimal 32 pixel, <=12 MP.")
if raw.ndim == 2:
    bgr = cv2.cvtColor(raw, cv2.COLOR_GRAY2BGR)
elif raw.ndim == 3 and raw.shape[2] == 3:
    bgr = raw.copy()
else:
    raise ValueError("Gunakan foto grayscale/3 channel tanpa alpha.")
print("Foto:", nama, "shape BGR:", bgr.shape)
plt.figure(figsize=(6, 5))
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.title("Foto unggahan")
plt.axis("off")
plt.show()

Sel 3 — 3. Buat dua kondisi noise terkontrol

Foto unggahan adalah referensi sebelum noise tambahan, bukan jaminan ground truth bebas noise kamera. Noise Gaussian dan impuls dihasilkan dengan seed tetap dan diberi label jelas.

referensi = bgr.copy()
rng = np.random.default_rng(42)
noise = rng.normal(0, 20, referensi.shape)
gaussian_noise = np.clip(referensi.astype(np.float32) + noise, 0, 255).astype(np.uint8)
salt_pepper = referensi.copy()
acak = rng.random(referensi.shape[:2])
salt_pepper[acak < 0.025] = 0
salt_pepper[acak > 0.975] = 255
input_noise = {"Gaussian tambahan (sigma=20)": gaussian_noise,
               "Salt-pepper tambahan (p=0.05)": salt_pepper}
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for ax, judul, img in zip(axes, ["Referensi sebelum noise tambahan"] + list(input_noise),
                         [referensi] + list(input_noise.values())):
    ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax.set_title(judul); ax.axis("off")
plt.tight_layout(); plt.show()

Sel 4 — 4. Bandingkan tiga teknik filtering

Sel memproses input noise yang sama dengan Gaussian, median, dan box blur. MSE dihitung pada array float untuk mencegah overflow. Semua angka berasal dari eksekusi file unggahan.

hasil_filter = {}
def mse(a, b):
    selisih = a.astype(np.float32) - b.astype(np.float32)
    return float(np.mean(selisih ** 2))
fig, axes = plt.subplots(2, 4, figsize=(18, 9))
for baris, (jenis, noisy) in enumerate(input_noise.items()):
    hasil = {"Input noise": noisy,
             "Gaussian k=5 sigma=1.2": cv2.GaussianBlur(noisy, (5, 5), 1.2),
             "Median k=5": cv2.medianBlur(noisy, 5),
             "Box k=5": cv2.blur(noisy, (5, 5))}
    hasil_filter[jenis] = hasil
    print("Kondisi:", jenis)
    for ax, (teknik, img) in zip(axes[baris], hasil.items()):
        skor = mse(img, referensi)
        print(teknik, "MSE terhadap referensi sebelum noise:", round(skor, 3))
        ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        ax.set_title(f"{teknik}; MSE={skor:.2f}"); ax.axis("off")
plt.tight_layout(); plt.show()

Sel 5 — 5. Denoise lalu sharpening

Contoh mempertajam hasil median pada input salt-pepper, kemudian membandingkan dengan sebelum sharpening. Kernel dan urutan operasi harus dicatat.

denoised = hasil_filter["Salt-pepper tambahan (p=0.05)"]["Median k=5"]
kernel_sharp = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], dtype=np.float32)
sharp = cv2.filter2D(denoised, ddepth=-1, kernel=kernel_sharp)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
for ax, judul, img in zip(axes, ["Median: sebelum sharpening", "Median + sharpening"],
                         [denoised, sharp]):
    ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax.set_title(judul); ax.axis("off")
plt.tight_layout(); plt.show()

Sel 6 — 6. Brightness, equalization, dan histogram

Brightness +40 menggunakan float dan clipping. Equalization diterapkan pada grayscale saja. Histogram dilengkapi label sumbu agar perubahan dapat dibaca.

bright = np.clip(referensi.astype(np.float32) + 40, 0, 255).astype(np.uint8)
gray = cv2.cvtColor(referensi, cv2.COLOR_BGR2GRAY)
bright_gray = cv2.cvtColor(bright, cv2.COLOR_BGR2GRAY)
equalized = cv2.equalizeHist(gray)
fig, axes = plt.subplots(2, 3, figsize=(15, 8))
for kolom, (judul, img) in enumerate([
        ("Grayscale referensi", gray), ("Brightness +40", bright_gray),
        ("Histogram equalization", equalized)]):
    axes[0, kolom].imshow(img, cmap="gray", vmin=0, vmax=255)
    axes[0, kolom].set_title(judul); axes[0, kolom].axis("off")
    hist = cv2.calcHist([img], [0], None, [256], [0, 256]).ravel()
    axes[1, kolom].plot(np.arange(256), hist)
    axes[1, kolom].set_xlim(0, 255)
    axes[1, kolom].set_xlabel("Intensitas"); axes[1, kolom].set_ylabel("Jumlah pixel")
print("Pixel grayscale bernilai 255 sebelum/sesudah brightness:",
      int(np.count_nonzero(gray == 255)), int(np.count_nonzero(bright_gray == 255)))
plt.tight_layout(); plt.show()

Jika terjadi error

Error pada ukuran kernel median/Gaussian.
Gunakan ukuran ganjil positif; median contoh memakai 5, Gaussian memakai (5,5). Pastikan input uint8.
Brightness menghasilkan pixel gelap yang tidak diharapkan.
Hindari penambahan langsung pada uint8; konversi float, clip 0–255, lalu astype uint8.
Filter dinilai terbaik hanya karena MSE terkecil.
Periksa detail dan tepi pada wilayah yang sama; jelaskan trade-off serta keterbatasan referensi.
Equalization membuat noise semakin terlihat.
Pahami bahwa penguatan kontras juga menguatkan variasi noise; bandingkan dengan denoise sebelum equalization.

Runtime Colab dan file upload bersifat sementara. Simpan output penting pada notebook/Drive sebelum sesi berakhir. Jika runtime direset, jalankan ulang sel dari awal. Gunakan media berizin dan hindari unggahan data sensitif tanpa izin.

4. Tugas 4

Bandingkan minimal tiga teknik filtering pada gambar yang memiliki noise. Gunakan foto sendiri dengan noise terkontrol seperti contoh atau foto noisy yang kondisinya dijelaskan. Kumpulkan hanya SATU link Google Colab akses Viewer dengan identitas, output, dan analisis.

Ketentuan pengerjaan

  1. Gunakan satu input noisy yang sama untuk seluruh filter dan tampilkan foto sumbernya.
  2. Terapkan minimal Gaussian blur, median blur, dan box blur; catat semua parameter.
  3. Jika menambahkan noise, jelaskan jenis, tingkat, seed, dan bahwa noise itu buatan pada foto asli.
  4. Tampilkan output sejajar serta pembesaran wilayah detail yang sama; pilih filter terbaik menurut tujuan yang jelas.
  5. Tambahkan eksperimen sharpening serta brightness/histogram sebagai pembahasan enhancement.
  6. Metrik terhadap referensi hanya digunakan jika referensi sebelum noise tersedia; jangan membuat angka kualitas palsu untuk foto tanpa referensi.
  7. Seluruh kode, output, analisis, Nama/NPM, dan satu link Viewer berada dalam notebook; tanpa file tambahan.

Pertanyaan analisis

  1. Filter mana paling sesuai untuk noise yang digunakan, dan detail apa yang hilang?
  2. Apa perubahan ketika kernel diperbesar dari 3 menjadi 5 atau 7?
  3. Mengapa sharpening setelah denoise tidak setara dengan mengembalikan detail asli?
  4. Apakah histogram dan MSE sejalan dengan penilaian visual Anda? Jelaskan menggunakan output.
Identitas di bagian paling atas notebook: tambahkan sel Text/Markdown sebelum kode dan isi Nama serta NPM.
# Materi 04 — Pengolahan Citra
Nama: [Nama lengkap mahasiswa]
NPM: [NPM mahasiswa]
Kelas: [Kelas, jika diperlukan]

Pengumpulan

Kumpulkan satu link Google Colab saja. Nama dan NPM wajib berada pada sel Markdown paling atas. Sertakan kode, output yang tersimpan/terlihat serta analisis di notebook; tidak perlu mengumpulkan file .ipynb, ZIP, PDF atau screenshot terpisah.

  1. Jalankan sel dengan konfigurasi valid dan simpan notebook beserta output. Pastikan opsi menghilangkan output saat menyimpan tidak aktif untuk versi pengumpulan.
  2. Bagikan sebagai Viewer/Pelihat kepada dosen. Gunakan akses link jika diizinkan institusi; bila dibatasi, beri akses khusus akun dosen. Jangan memberi izin edit publik.
  3. Periksa akses dari akun penerima. Kirim URL notebook Colab, bukan folder Drive atau runtime sementara.
AspekBobotIndikator
Input dan rancangan perbandingan20%Sumber, noise, parameter, serta input identik untuk perbandingan jelas.
Tiga teknik filtering35%Gaussian, median, box blur berjalan dan hasil ditampilkan dengan benar.
Enhancement dan evaluasi25%Sharpening, brightness/histogram, detail crop, dan metrik bila sah diperiksa.
Analisis dan notebook20%Trade-off dijelaskan dari hasil; identitas, output, dan satu link Viewer lengkap.