Mode belajar: tulis kode sendiri. Copy/cut, seleksi teks dan klik kanan dibatasi pada halaman; pembatasan UI bukan jaminan anti-penyalinan mutlak.
1. Tujuan
- Menerapkan threshold binary global dengan polaritas foreground yang sesuai.
- Membandingkan adaptive threshold dan Otsu beserta parameter serta batasannya.
- Membentuk mask uint8 satu channel dan menggunakannya untuk mengekstrak objek serta background.
- Mengevaluasi hasil segmentasi melalui kesalahan lokasi, kehilangan detail, dan pengaruh pencahayaan.
Prasyarat: Dapat membaca gambar dan memahami grayscale serta filtering dasar. Notebook ini memiliki import dan upload sendiri tanpa ketergantungan pada modul sebelumnya.
2. Materi Pembahasan

2.1 Segmentasi sebagai keputusan lokasi
Segmentasi memisahkan bagian citra menurut aturan tertentu, misalnya objek dan background. Pada contoh, setiap pixel mendapat keputusan foreground atau background sehingga hasilnya berupa mask biner. Nilai putih menyatakan pixel yang dipilih, bukan otomatis permukaan paling terang pada foto. Arti mask ditentukan oleh aturan threshold dan polaritasnya. Segmentasi yang baik mempertahankan area objek yang diperlukan serta menolak area latar yang tidak relevan.
Pisahkan masalah segmentasi dari identifikasi kategori. Threshold dapat memilih siluet benda, tetapi tidak mengetahui nama benda atau spesies daun. Bahkan ketika hanya satu objek yang diharapkan, tekstur background dapat membentuk area lain yang terpilih. Oleh sebab itu keberhasilan harus diperiksa terhadap foto sumber, khususnya batas objek, lubang, tangkai, dan daerah berbayang, bukan hanya jumlah pixel putih.
2.2 Threshold global dan polaritas
Binary threshold menggunakan satu nilai T untuk seluruh gambar grayscale. Pada THRESH_BINARY, intensitas di atas T menjadi 255 dan sisanya nol. THRESH_BINARY_INV membalik keputusan sehingga objek gelap pada background terang dapat menjadi foreground putih. Contoh memiliki parameter OBJEK_GELAP yang harus dipilih berdasarkan foto. Tanpa memeriksa polaritas, output yang secara sintaks benar dapat justru mengekstrak background.
Nilai T=127 dipakai sebagai baseline untuk melihat konsekuensi ambang tetap. Angka tersebut tidak dijanjikan sesuai semua foto. Jika objek dan background mempunyai intensitas yang saling tumpang tindih, tidak ada satu threshold yang memisahkan keduanya secara sempurna. Mengubah T dapat mengurangi kesalahan satu bagian tetapi menambah kesalahan bagian lain. Catat perubahan parameter agar perbandingan tidak hanya bergantung pada kesan visual.
2.3 Adaptive threshold pada pencahayaan lokal
Adaptive threshold menentukan ambang berdasarkan lingkungan tiap pixel. Contoh memakai rata-rata Gaussian lokal melalui ADAPTIVE_THRESH_GAUSSIAN_C, dengan blockSize=31 dan C=5. Ukuran blok harus ganjil dan lebih dari satu. C dikurangkan dari nilai lokal untuk membentuk threshold. Kedua parameter mempengaruhi ukuran pola yang dianggap foreground, sehingga hasil pada objek besar dan tekstur kecil dapat berbeda.
Metode lokal membantu ketika sebagian foto lebih gelap karena bayangan, tetapi bukan solusi universal. Ia dapat menonjolkan tekstur di dalam objek atau background dan menghasilkan banyak fragmen. Berbeda dari segmentasi siluet penuh, beberapa hasil adaptive tampak seperti peta detail. Pertimbangkan tujuan: bila ingin seluruh daun, mask tekstur yang berongga mungkin tidak memadai walaupun perubahan intensitas lokal terdeteksi dengan baik.
2.4 Otsu dan prapemrosesan
Otsu menentukan threshold global dari distribusi histogram, dengan mencari pemisahan yang meminimalkan variasi dalam dua kelompok. Metode ini sering membantu saat foreground dan background membentuk kelompok intensitas berbeda. Sel menampilkan threshold Otsu yang benar-benar dihitung, sehingga mahasiswa dapat membandingkannya dengan T tetap. Otsu tidak memakai label objek atau anotasi dan tidak otomatis mengerti pencahayaan yang berubah secara lokal.
Gaussian blur ringan digunakan sebelum ketiga metode supaya perbandingannya memakai input sama. Prapemrosesan dapat menurunkan fluktuasi noise, tetapi juga melembutkan batas objek. Pada histogram yang tidak terpisah jelas, Otsu tetap mengeluarkan angka, namun angka tersebut bukan jaminan segmentasi akurat. Periksa histogram bersama mask dan lokasi kesalahan; jangan menilai metode hanya karena ia memilih threshold tanpa intervensi pengguna.
2.5 Masking, perapihan, dan evaluasi
Mask terpilih diterapkan pada gambar warna dengan bitwise_and. Invers mask digunakan untuk mengekstrak background, sementara overlay warna membantu memeriksa batas keputusan terhadap foto asli. Background pada ekstraksi objek tampil hitam karena dihapus oleh mask. Ini berbeda dari mengubah background asli menjadi label kategori baru. Dimensi mask harus sama dengan gambar dan tipenya uint8 satu channel.
Opening dapat menghapus bintik kecil, sedangkan closing dapat menutup celah kecil, tetapi keduanya juga mengubah geometri objek. Contoh memakai kernel kecil dan menampilkan mask sebelum serta sesudah perapihan. Bandingkan tangkai, ujung, lubang, dan batas tipis agar proses tidak merusak fitur penting. Tanpa anotasi ground truth, laporkan kesalahan secara visual dan kualitatif; jangan mengarang akurasi segmentasi. Gunakan parameter yang terdokumentasi dan jelaskan pilihan metode akhir.
Video pembelajaran sesuai bab
OpenCV Python Image Thresholding — Kevin Wood | Robotics & AI.
Fokus saat menonton: Amati bagaimana threshold membuat mask biner, bagaimana nilai ambang dipilih dan kapan latar tidak seragam menjadi masalah.
Referensi dan sumber ilustrasi
3. Praktikum 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.
# Materi 05 — Pengolahan Citra
Nama: [Nama lengkap mahasiswa]
NPM: [NPM mahasiswa]
Kelas: [Kelas, jika diperlukan]- Upload satu foto objek dengan background sederhana dan intensitas yang berbeda, misalnya daun pada kertas terang.
- Tentukan apakah objek lebih gelap daripada background; set OBJEK_GELAP sebelum menjalankan threshold.
- Jalankan tiga metode pada grayscale blur yang sama; bandingkan mask dan nilai threshold Otsu.
- Ubah T, blockSize, atau C satu per satu dan catat pengaruh masing-masing.
- Pilih metode berdasarkan pemisahan objek; bandingkan mask awal dengan setelah morfologi.
- Tampilkan foreground, background, serta overlay dan jelaskan kesalahan batas pada sel Markdown.
- Jalankan ulang notebook dan kumpulkan satu link Google Colab Viewer dengan output terlihat.
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 filesSel 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. Binary, adaptive, dan Otsu
Gunakan foto objek gelap pada latar terang untuk parameter awal. Ubah OBJEK_GELAP menjadi False bila objek lebih terang. Semua metode memakai grayscale blur yang sama.
gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
OBJEK_GELAP = True
mode = cv2.THRESH_BINARY_INV if OBJEK_GELAP else cv2.THRESH_BINARY
T = 127
_, binary = cv2.threshold(blur, T, 255, mode)
adaptive = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
mode, 31, 5)
T_otsu, otsu = cv2.threshold(blur, 0, 255, mode | cv2.THRESH_OTSU)
masks = {"Binary T=127": binary, "Adaptive block=31 C=5": adaptive, "Otsu": otsu}
print("Objek gelap:", OBJEK_GELAP, "T global:", T, "T Otsu:", T_otsu)
for metode, mask in masks.items():
print(metode, "pixel foreground:", int(np.count_nonzero(mask)))Sel 4 — 4. Bandingkan mask dan histogram
Mask putih harus sesuai foreground yang Anda maksud. Periksa foto sumber agar tidak memilih background secara tidak sengaja.
fig, axes = plt.subplots(2, 3, figsize=(15, 9))
axes[0, 0].imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)); axes[0, 0].set_title("Foto sumber")
axes[0, 1].imshow(blur, cmap="gray", vmin=0, vmax=255); axes[0, 1].set_title("Grayscale + blur")
hist = cv2.calcHist([blur], [0], None, [256], [0, 256]).ravel()
axes[0, 2].plot(np.arange(256), hist)
axes[0, 2].axvline(T, color="red", label=f"T tetap={T}")
axes[0, 2].axvline(T_otsu, color="green", label=f"T Otsu={T_otsu:.0f}")
axes[0, 2].set_xlabel("Intensitas"); axes[0, 2].set_ylabel("Jumlah pixel")
axes[0, 2].legend(); axes[0, 2].set_title("Histogram input threshold")
for ax, (metode, mask) in zip(axes[1], masks.items()):
ax.imshow(mask, cmap="gray", vmin=0, vmax=255); ax.set_title(metode); ax.axis("off")
axes[0, 0].axis("off"); axes[0, 1].axis("off")
plt.tight_layout(); plt.show()Sel 5 — 5. Pisahkan foreground dan background
Default memilih Otsu, tetapi ubah PILIH berdasarkan hasil perbandingan. Perapihan opening/closing bukan wajib dan harus diperiksa pengaruhnya pada detail tipis.
PILIH = "Otsu"
if PILIH not in masks:
raise ValueError("PILIH harus salah satu nama pada dictionary masks.")
mask_awal = masks[PILIH].copy()
kernel = np.ones((3, 3), dtype=np.uint8)
mask_bersih = cv2.morphologyEx(mask_awal, cv2.MORPH_OPEN, kernel)
mask_bersih = cv2.morphologyEx(mask_bersih, cv2.MORPH_CLOSE, kernel)
foreground = cv2.bitwise_and(bgr, bgr, mask=mask_bersih)
background = cv2.bitwise_and(bgr, bgr, mask=cv2.bitwise_not(mask_bersih))
overlay = bgr.copy()
warna = np.empty_like(bgr); warna[:] = (0, 255, 0)
campuran = cv2.addWeighted(bgr, 0.6, warna, 0.4, 0)
overlay[mask_bersih > 0] = campuran[mask_bersih > 0]
jumlah = int(np.count_nonzero(mask_bersih))
print("Metode:", PILIH, "foreground:", jumlah, "dari", mask_bersih.size, "pixel")
if jumlah == 0 or jumlah == mask_bersih.size:
print("Peringatan: mask kosong/penuh; periksa polaritas, foto, dan parameter.")
fig, axes = plt.subplots(1, 5, figsize=(20, 5))
for ax, judul, img in zip(axes,
["Mask awal", "Mask setelah morfologi", "Objek", "Background", "Overlay foreground"],
[mask_awal, mask_bersih, foreground, background, overlay]):
if img.ndim == 2:
ax.imshow(img, cmap="gray", vmin=0, vmax=255)
else:
ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax.set_title(judul); ax.axis("off")
plt.tight_layout(); plt.show()Jika terjadi error
- Background justru menjadi foreground.
- Ubah OBJEK_GELAP atau polaritas binary/inverse; putih pada mask harus mewakili objek yang dimaksud.
- adaptiveThreshold menolak parameter.
- Input harus grayscale uint8, blockSize ganjil >1, dan maxValue contoh 255.
- Mask adaptive penuh fragmen.
- Evaluasi ukuran blockSize/C dan tekstur latar; tidak semua foto sesuai segmentasi siluet dengan adaptive.
- Morfologi menghapus tangkai daun.
- Kurangi kernel atau lewati opening; bandingkan mask sebelum/sesudah dan jangan menghapus detail penting demi tampilan rapi.
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 5
Pisahkan objek dan background pada satu foto menggunakan thresholding, lalu tampilkan hasil segmentasi. Kumpulkan hanya SATU link Google Colab akses Viewer dengan identitas, kode, output, dan analisis.
Ketentuan pengerjaan
- Gunakan foto nyata sendiri dengan objek serta background yang dijelaskan.
- Bandingkan threshold binary, adaptive, dan Otsu pada input yang sama; catat T, blockSize, C, serta polaritas.
- Tampilkan foto, grayscale, histogram, dan seluruh mask; nilai Otsu harus berasal dari eksekusi.
- Pilih satu mask akhir dan tampilkan foreground, background, serta overlay.
- Jika memakai morfologi, tampilkan sebelum/sesudah dan jelaskan perubahan area/detail.
- Bahas minimal dua lokasi yang berhasil atau gagal dipisahkan; tanpa klaim akurasi numerik jika tidak ada ground truth.
- Semua hasil, Nama/NPM, serta analisis berada pada satu notebook; tidak mengirim file tambahan.
Pertanyaan analisis
- Mengapa polaritas mask dipilih demikian pada foto Anda?
- Bagaimana pencahayaan dan overlap intensitas mempengaruhi tiga metode?
- Apa yang terjadi pada batas tipis atau lubang setelah morfologi?
- Apakah metode otomatis Otsu selalu lebih baik daripada ambang manual pada hasil Anda?
# Materi 05 — 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.
- Jalankan sel dengan konfigurasi valid dan simpan notebook beserta output. Pastikan opsi menghilangkan output saat menyimpan tidak aktif untuk versi pengumpulan.
- Bagikan sebagai Viewer/Pelihat kepada dosen. Gunakan akses link jika diizinkan institusi; bila dibatasi, beri akses khusus akun dosen. Jangan memberi izin edit publik.
- Periksa akses dari akun penerima. Kirim URL notebook Colab, bukan folder Drive atau runtime sementara.
| Aspek | Bobot | Indikator |
|---|---|---|
| Input dan tiga metode | 30% | Input sama, tiga threshold berjalan, dan parameter serta polaritas jelas. |
| Segmentasi akhir | 35% | Foreground/background/overlay sesuai mask dan dapat diperiksa terhadap foto. |
| Analisis keterbatasan | 20% | Kesalahan lokasi dan efek parameter/morfologi dijelaskan dari output. |
| Notebook dan penyerahan | 15% | Kode mandiri, identitas, semua output, dan satu link Viewer lengkap. |