Pengolahan Citra · Materi 01

Pengenalan Pengolahan Citra & Setup Python

Membaca tiga gambar di Google Colab dan menafsirkan pixel, resolusi, ukuran, serta channel tanpa instalasi lokal.

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. Membuat notebook Google Colab dengan identitas Nama dan NPM serta menjalankan sel Python secara berurutan.
  2. Membaca tiga file gambar berbeda, memvalidasi hasil decoding, dan menampilkan gambarnya.
  3. Mengukur tinggi, lebar, jumlah pixel, jumlah channel, tipe data, dan ukuran file setiap gambar.
  4. Mengakses nilai pixel pada koordinat valid dan menjelaskan urutan channel BGR, grayscale, atau BGRA.

Prasyarat: Dapat menggunakan browser, akun Google, dan operasi dasar variabel serta indeks Python. Tidak memerlukan instalasi Python di komputer.

2. Materi Pembahasan

Foto sumber: Wikimedia Commons, CC BY 3.0; perbesaran tidak menambah detail baru.
Foto sumber: Wikimedia Commons, CC BY 3.0; perbesaran tidak menambah detail baru.

2.1 Pengolahan citra sebagai transformasi data

Citra digital bukan sekadar gambar yang terlihat di layar, melainkan susunan nilai yang dapat dibaca dan diubah program. Satu pixel mewakili sampel pada lokasi tertentu. Foto daun, misalnya, menyimpan informasi warna permukaan, bayangan, dan latar pada banyak lokasi. Pengolahan citra mengubah susunan tersebut untuk tujuan seperti memperjelas kontras, memisahkan objek, atau mencari batas bentuk. Proses ini berbeda dari pemahaman semantik: program membaca nilai pixel terlebih dahulu, bukan otomatis mengetahui bahwa objeknya daun.

Alur awal yang sehat adalah menetapkan input, memeriksa data, melakukan operasi, lalu mengevaluasi output. Dalam modul ini belum diperlukan model kecerdasan buatan. Membaca dan memeriksa tiga gambar sudah menunjukkan bahwa ukuran, pencahayaan, serta format input dapat berbeda. Kesalahan pembacaan harus diketahui sebelum algoritme berikutnya dijalankan, agar hasil tidak ditafsirkan dari data yang sebenarnya kosong.

2.2 Resolusi, dimensi, dan ukuran berkas

Dimensi spasial ditulis sebagai lebar × tinggi, sedangkan shape array NumPy lazimnya diawali tinggi lalu lebar. Jumlah pixel dihitung dari perkalian kedua dimensi tersebut, tanpa mengalikan jumlah channel. Istilah resolusi pada praktikum ini berarti dimensi pixel, bukan ukuran cetak atau dpi. Foto beresolusi lebih besar memiliki lebih banyak sampel spasial, tetapi tidak selalu lebih tajam jika fokus, gerakan kamera, atau kualitas lensa buruk.

Ukuran file adalah jumlah byte data tersimpan, sedangkan nbytes array menyatakan memori data setelah decoding. Keduanya tidak harus sama karena JPEG menggunakan kompresi dan PNG menyimpan data dengan cara berbeda. Membandingkan ukuran file saja tidak cukup untuk menyimpulkan kualitas gambar. Catat dimensi, format, tipe data, dan ukuran byte bersama-sama agar istilah ukuran tidak ambigu ketika melaporkan hasil.

2.3 Channel dan representasi intensitas

Gambar grayscale menyimpan satu intensitas untuk setiap posisi dan biasanya berbentuk array dua dimensi. Gambar berwarna lazimnya memiliki tiga channel. OpenCV membaca warna dalam urutan biru, hijau, merah atau BGR; Matplotlib menafsirkan tiga komponen sebagai merah, hijau, biru atau RGB. PNG tertentu mempunyai channel alpha keempat yang menyatakan transparansi. Membaca dengan IMREAD_UNCHANGED membantu mengamati channel asli, sehingga grayscale tidak diam-diam diubah menjadi tiga channel.

Untuk citra uint8, setiap komponen memiliki rentang 0 sampai 255. Nilai tersebut bukan ukuran suhu atau ukuran fisik warna. Citra dengan kedalaman bit lain dapat memiliki rentang berbeda. Praktikum membatasi input ke uint8 supaya pembacaan nilai dan tampilan konsisten. Ketika alpha tersedia, konversi BGRA ke RGBA dilakukan khusus untuk tampilan; array asli tetap dipertahankan untuk pengukuran.

2.4 Koordinat dan pembacaan pixel

Titik gambar biasa disebut dengan pasangan (x, y), tetapi akses array menggunakan img[y, x]. Baris meningkat ke bawah dan kolom meningkat ke kanan, dengan titik awal di kiri atas. Karena indeks dimulai dari nol, indeks yang sama dengan tinggi atau lebar sudah melewati batas. Sel contoh memilih titik tengah setiap gambar dan menampilkan koordinatnya secara eksplisit. Dengan demikian gambar kecil tetap dapat diproses tanpa memakai koordinat tetap yang mungkin tidak tersedia.

Pada gambar warna, hasil akses satu pixel berupa vektor komponen, bukan satu bilangan. Jelaskan vektor itu menurut urutan channel sumber. Membandingkan satu pixel dari tiga foto tidak otomatis membandingkan objek yang sama, sebab posisi tengah dapat berisi latar pada salah satu foto. Untuk tugas, pilih pula titik yang secara visual berada pada objek atau background dan catat alasan pemilihannya.

2.5 Notebook Colab yang dapat diperiksa

Google Colab menjalankan Python melalui runtime jarak jauh dan menampilkan hasil di browser. Sel kode dikerjakan berurutan karena variabel hasil pembacaan diperlukan pada sel berikutnya. Setelah runtime terputus, variabel dan file sementara dapat hilang; menjalankan sel upload kembali adalah tindakan yang wajar. Notebook harus menyimpan kode, output, serta analisis mahasiswa, bukan hanya teks tanpa hasil eksekusi. Sel Markdown paling atas digunakan untuk Nama dan NPM.

Gunakan files.upload untuk memilih tiga gambar JPEG atau PNG yang berbeda. Periksa hasil decoding, batas ukuran, dan jumlah input, bukan hanya ekstensi nama berkas. Semua tampilan memakai Matplotlib, bukan jendela desktop cv2.imshow. Sesudah selesai, jalankan ulang seluruh sel pada runtime bersih untuk memastikan tidak ada ketergantungan tersembunyi, lalu bagikan satu link Google Colab dengan akses Viewer.

Video pembelajaran sesuai bab

25 - Reading Images, Splitting Channels, Resizing using openCV in Python — DigitalSreeni.

Fokus saat menonton: Amati cara membaca gambar, shape array, nilai piksel dan urutan BGR. Bedakan ukuran berkas dengan resolusi.

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 01 — Pengolahan Citra
Nama: [Nama lengkap mahasiswa]
NPM: [NPM mahasiswa]
Kelas: [Kelas, jika diperlukan]
  1. Buka Google Colab; buat sel Markdown Nama dan NPM, lalu ketik sel kode sesuai urutan.
  2. Siapkan tiga gambar berbeda, misalnya daun, objek berwarna, dan gambar grayscale uint8.
  3. Upload ketiganya sekaligus; jika validasi gagal, perbaiki input dan jalankan kembali sel upload.
  4. Baca laporan ukuran dan bandingkan shape array dengan dimensi lebar × tinggi pada judul gambar.
  5. Tentukan satu koordinat valid per gambar, baca nilai pixel, dan jelaskan urutan channel serta lokasi titik.
  6. Tambahkan analisis sebagai sel Markdown, jalankan semua sel ulang, simpan output, lalu atur akses link Viewer.

Sel 1 — 1. Import library di Colab

Buat notebook baru, isi sel Markdown Nama dan NPM di atas, kemudian ketik dan jalankan sel ini. Library umum Colab tidak perlu diinstal lokal.

import cv2
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files
print("OpenCV:", cv2.__version__)

Sel 2 — 2. Upload dan validasi tiga gambar

Pilih tepat tiga JPEG/PNG berbeda dalam satu dialog. Maksimum 10 MiB dan 12 juta pixel per gambar; input harus uint8 dengan 1, 3, atau 4 channel.

uploaded = files.upload()
if len(uploaded) != 3:
    raise ValueError("Pilih tepat tiga file gambar berbeda; jalankan ulang sel upload.")
if len(set(uploaded.values())) != 3:
    raise ValueError("Isi ketiga file harus berbeda, bukan salinan file yang sama.")
gambar = []
for nama, data in uploaded.items():
    if not nama.lower().endswith((".jpg", ".jpeg", ".png")):
        raise ValueError(f"{nama}: gunakan JPEG atau PNG.")
    if not data or len(data) > 10 * 1024 * 1024:
        raise ValueError(f"{nama}: file kosong atau melebihi 10 MiB.")
    img = cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_UNCHANGED)
    if img is None:
        raise ValueError(f"{nama}: tidak dapat didecode sebagai gambar.")
    h, w = img.shape[:2]
    channel = 1 if img.ndim == 2 else img.shape[2]
    if h * w > 12_000_000 or img.dtype != np.uint8 or channel not in (1, 3, 4):
        raise ValueError(f"{nama}: gunakan gambar uint8 <=12 MP, channel 1/3/4.")
    gambar.append({"nama": nama, "img": img, "file_bytes": len(data)})
print("Tiga gambar berhasil dibaca.")

Sel 3 — 3. Tampilkan gambar dan laporan ukuran

Output membedakan dimensi spasial, jumlah pixel, jumlah channel, byte file, dan byte array. Urutan channel hanya dikonversi saat tampilan.

fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for ax, item in zip(axes, gambar):
    img = item["img"]
    h, w = img.shape[:2]
    c = 1 if img.ndim == 2 else img.shape[2]
    if c == 1:
        ax.imshow(img, cmap="gray", vmin=0, vmax=255)
    else:
        flag = cv2.COLOR_BGR2RGB if c == 3 else cv2.COLOR_BGRA2RGBA
        ax.imshow(cv2.cvtColor(img, flag))
    ax.set_title(f"{item['nama']}\n{w} × {h} pixel; {c} channel")
    ax.axis("off")
    print({"nama": item["nama"], "shape": img.shape, "lebar": w,
           "tinggi": h, "jumlah_pixel": w*h, "channel": c,
           "dtype": str(img.dtype), "file_bytes": item["file_bytes"],
           "array_bytes": img.nbytes})
plt.tight_layout()
plt.show()

Sel 4 — 4. Baca pixel pada titik tertentu

Contoh memilih titik tengah yang selalu valid. Untuk tugas ubah koordinat pada setiap gambar, tetap periksa rentangnya, dan jelaskan apakah titik berada pada objek atau latar.

for item in gambar:
    img = item["img"]
    h, w = img.shape[:2]
    x, y = w // 2, h // 2
    if not (0 <= x < w and 0 <= y < h):
        raise ValueError("Koordinat pixel di luar gambar.")
    c = 1 if img.ndim == 2 else img.shape[2]
    urutan = {1: "grayscale", 3: "B, G, R", 4: "B, G, R, A"}[c]
    print(f"{item['nama']}: (x,y)=({x},{y}), nilai={img[y,x].tolist()}, urutan={urutan}")

Jika terjadi error

Jumlah file tidak tepat tiga atau isi file identik.
Pilih tiga file berbeda sekaligus dan jalankan ulang sel upload.
Foto tampil dengan merah dan biru tertukar.
Gunakan COLOR_BGR2RGB; untuk empat channel gunakan COLOR_BGRA2RGBA.
IndexError ketika membaca pixel.
Gunakan img[y, x] dengan y < tinggi dan x < lebar; indeks dimulai dari nol.
NameError setelah runtime terputus.
Jalankan ulang import dan upload sebelum sel pengukuran. File unggahan sementara bukan penyimpanan permanen.

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 1

Buat program Google Colab yang membaca tiga gambar berbeda, menampilkan ketiganya, serta melaporkan ukuran/resolusi/channel dan nilai pixel tertentu pada setiap gambar. Kumpulkan hanya SATU link Google Colab dengan kode, output, analisis, Nama dan NPM terlihat; akses Viewer.

Ketentuan pengerjaan

  1. Tiga gambar JPEG/PNG berbeda dibaca dengan validasi, bukan tiga salinan satu file.
  2. Tampilkan setiap gambar dengan urutan warna benar.
  3. Laporkan nama file, lebar, tinggi, jumlah pixel, channel, tipe data, byte file, dan byte array.
  4. Catat minimal satu koordinat (x, y) valid per gambar, nilai pixelnya, serta makna urutan channel.
  5. Sertakan analisis perbedaan ketiga gambar dalam sel Markdown dan semua output eksekusi.
  6. Serahkan satu link Google Colab akses Viewer; tidak mengumpulkan .ipynb, ZIP, PDF, atau screenshot terpisah.

Pertanyaan analisis

  1. Mengapa dimensi spasial pada laporan berbeda urutannya dari shape array?
  2. Apakah file dengan byte terbesar selalu memiliki jumlah pixel terbesar? Gunakan data unggahan untuk menjawab.
  3. Apa yang dapat dan tidak dapat disimpulkan dari nilai satu pixel?
Identitas di bagian paling atas notebook: tambahkan sel Text/Markdown sebelum kode dan isi Nama serta NPM.
# Materi 01 — 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
Pembacaan dan validasi25%Tiga file berbeda terbaca dan kasus input tidak valid ditangani.
Ukuran dan channel30%Dimensi, jumlah pixel, channel, dtype, serta ukuran byte benar dan tidak tertukar.
Tampilan dan nilai pixel25%Warna benar, koordinat valid, nilai pixel serta urutan channel dijelaskan.
Analisis dan notebook20%Analisis menggunakan output sendiri; identitas, output, dan satu link Viewer lengkap.