Materi Pertemuan 3

Materi Pertemuan 3

Ruang Warna dan Operasi Piksel , Logika dan Aritmatika

Praktikum Pengolahan Citra Digital — Pertemuan 3

Bedah Deklarasi Kode & Panduan Tugas GUI Operasi Aritmatika & Logika Citra

Dosen Pengampu: Alimin, M.Kom • Program Studi Sistem dan Teknologi Informasi[cite: 1]

1. Konsep Dasar & Persyaratan Operasi Matriks

Pada pertemuan sebelumnya telah dipelajari bahwa citra digital adalah matriks numerik dua dimensi $f(y, x)$[cite: 1]. Operasi aritmatika dan logika citra adalah operasi titik (*point operations*) atau operasi biner antar-matriks yang dilakukan pada piksel-piksel yang bersesuaian.

Syarat Mutlak Aljabar Citra: Dua citra $A$ dan $B$ hanya dapat dioperasikan secara aritmatika maupun logika jika memiliki dimensi spasial yang identik (Tinggi $\times$ Lebar) dan jumlah kanal yang sama (misal sama-sama RGB 3-channel atau Grayscale 1-channel).

2. Penjelasan Lengkap Tiap Deklarasi Program (Source Code Breakdown)

A. Deklarasi Impor Pustaka (Library Imports)[cite: 23]
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import cv2
import numpy as np
from PIL import Image, ImageTk
  • import tkinter as tk: Mengimpor modul dasar pustaka GUI standar bawaan Python untuk membentuk jendela utama, tombol, dan canvas[cite: 23].
  • from tkinter import filedialog, messagebox, ttk: filedialog membuka jendela jelajah file di sistem operasi, messagebox memunculkan pop-up dialog/peringatan, dan ttk menyediakan widget modern seperti Combobox (menu pilihan dropdown)[cite: 23].
  • import cv2: Mengimpor pustaka OpenCV (Open Source Computer Vision) untuk pemrosesan citra digital berperforma tinggi dan terakselerasi C++[cite: 23].
  • import numpy as np: Mengimpor NumPy untuk memanipulasi array multidimensi dan operasi aljabar linier[cite: 23].
  • from PIL import Image, ImageTk: Pustaka Pillow bertindak sebagai adaptor yang mengubah matriks piksel NumPy/OpenCV ke format objek grafis yang dapat dirender oleh Tkinter[cite: 23].
B. Konstruktor & Inisialisasi State Aplikasi[cite: 23]
class ArithmeticLogicApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Pertemuan 3: Operasi Aritmatika & Logika Citra")
        self.root.geometry("1000x650")
        self.root.configure(bg="#f8fafc")

        self.img1 = None
        self.img2 = None

        self.setup_ui()
  • class ArithmeticLogicApp: Membungkus keseluruhan variabel dan method aplikasi dalam satu paradigma Object-Oriented Programming (OOP) yang terstruktur dan mudah dirawat[cite: 23].
  • self.root.geometry("1000x650"): Menentukan resolusi awal ukuran jendela aplikasi sebesar 1000 piksel lebar dan 650 piksel tinggi[cite: 23].
  • self.img1 = None; self.img2 = None: Variabel *state* penampung matriks array gambar[cite: 23]. Diinisialisasi dengan None agar sistem dapat mengecek validasi apakah pengguna sudah memilih gambar atau belum sebelum komputasi dieksekusi[cite: 23].
C. Pemuatan Citra & Penyesuaian Rasio (Rendering)[cite: 23]
def load_img1(self):
    p = filedialog.askopenfilename(filetypes=[("Image Files", "*.png *.jpg *.jpeg *.bmp")])
    if p:
        self.img1 = cv2.imread(p)
        self.render(self.img1, self.panel_a)
        self.apply_operation()

def render(self, cv_img, lbl):
    rgb = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
    h, w, _ = rgb.shape
    scale = min(300 / w, 400 / h)
    disp_w = max(1, int(w * scale))
    disp_h = max(1, int(h * scale))
    resized = cv2.resize(rgb, (disp_w, disp_h))
    img_tk = ImageTk.PhotoImage(image=Image.fromarray(resized))
    lbl.config(image=img_tk, text="")
    lbl.image = img_tk
  • cv2.imread(p): Membaca berkas gambar biner dari media penyimpanan dan mengubahnya menjadi matriks array 3 dimensi berurutan BGR (Blue, Green, Red) dengan kedalaman 8-bit[cite: 23].
  • cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB): Mengonversi skema BGR bawaan OpenCV menjadi RGB standar yang dikenali pustaka PIL[cite: 23].
  • scale = min(300 / w, 400 / h): Menghitung rasio penskalaan proporsional agar gambar sebesar apa pun tetap pas ditampilkan pada panel antarmuka tanpa mengalami distorsi bentuk[cite: 23].
  • lbl.image = img_tk: Menyimpan referensi objek ke memori widget Tkinter untuk mencegah penghapusan otomatis oleh mekanisme Garbage Collector Python[cite: 23].
D. Inti Komputasi Aritmatika, Logika, & Blending[cite: 23]
# 1. Operasi Unary (1 Citra): Pembalikan Bit Piksel
if op == "NOT A":
    res = cv2.bitwise_not(self.img1)

# 2. Sinkronisasi Dimensi Spasial (Resize Otomatis)
h, w = self.img1.shape[:2]
img2_resized = cv2.resize(self.img2, (w, h))

# 3. Penjumlahan Jenuh (Saturasi)
if op == "Add (A + B)":
    res = cv2.add(self.img1, img2_resized)

# 4. Pengurangan Terpotong (Clamping ke Nol)
elif op == "Subtract (A - B)":
    res = cv2.subtract(self.img1, img2_resized)

# 5. Perkalian Dinormalisasi (Scaling Factor)
elif op == "Multiply (A * B)":
    res = cv2.multiply(self.img1, img2_resized, scale=1.0/255.0)

# 6. Operasi Logika Biner Bitwise
elif op == "AND":
    res = cv2.bitwise_and(self.img1, img2_resized)
elif op == "OR":
    res = cv2.bitwise_or(self.img1, img2_resized)
elif op == "XOR":
    res = cv2.bitwise_xor(self.img1, img2_resized)

# 7. Peleburan Citra Berbobot (Alpha Blending)
elif op == "Blend (Alpha Slider)":
    alpha = self.slider_alpha.get()
    res = cv2.addWeighted(self.img1, alpha, img2_resized, 1 - alpha, 0)
  • cv2.bitwise_not(self.img1): Menghitung komplemen nilai piksel ($255 - I$). Piksel putih (255) berubah menjadi hitam (0), dan sebaliknya[cite: 18, 23].
  • cv2.resize(self.img2, (w, h)): Menyamakan resolusi Citra B agar pas dengan dimensi baris dan kolom Citra A, mencegah timbulnya galat ValueError: operands could not be broadcast together[cite: 23].
  • cv2.add() vs NumPy +: cv2.add() melakukan pembatasan jenuh (*saturation clamping*), misal $200 + 70 = 255$[cite: 23]. Jika menggunakan penjumlahan operator plus NumPy biasa, akan terjadi *modulo overflow* ($270 \pmod{256} = 14$) yang merusak citra dengan bercak hitam[cite: 23].
  • cv2.multiply(..., scale=1.0/255.0): Karena citra 8-bit memiliki rentang 0–255, perkalian langsung ($255 \times 255 = 65025$) akan langsung jenuh putih total[cite: 23]. Penggunaan faktor skala $\frac{1}{255}$ menormalkan nilai kembali ke rentang $[0, 255]$[cite: 23].
  • cv2.addWeighted(): Menghitung kombinasi linier $C = \alpha \cdot A + (1 - \alpha) \cdot B + \gamma$[cite: 23]. Jumlah bobot selalu sama dengan 1, sehingga menghasilkan efek transisi transparansi yang halus dan stabil[cite: 23].

3. Instruksi Penugasan Praktikum Kelompok (3 Orang per Kelompok)[cite: 1]

Praktikum ini dikerjakan secara berkelompok (1 kelompok = 3 mahasiswa)[cite: 1]. Mahasiswa diwajibkan memahami seluruh deklarasi kode di atas, mempraktikkan program, mengembangkannya dengan fitur baru, serta mengunggah luaran berupa Source Code Project, Laporan Teknis PDF, dan Video Presentasi YouTube[cite: 1].

Pembagian Peran & Tanggung Jawab Anggota[cite: 1]:

Anggota 1: Developer GUI & Fitur Baru[cite: 1]

Bertanggung jawab menjalankan source code Python, memperbaiki kendala dependensi lokal, serta mengimplementasikan minimal 2 fitur modifikasi baru ke dalam program GUI[cite: 1, 23].

Anggota 2: Penulis Laporan Ilmiah[cite: 1]

Menyusun dokumen laporan praktikum format PDF: membedah deklarasi kode, menyajikan screenshot pengujian, menganalisis perbedaan matematis, dan menarik kesimpulan[cite: 1].

Anggota 3: Video Demo & Presentasi[cite: 1]

Merekam layar saat program dijalankan, mendemonstrasikan hasil operasi aritmatika/logika, mengunggah video ke YouTube, dan melampirkan link publiknya di dalam laporan[cite: 1].

Tantangan Modifikasi Program (Wajib Dikembangkan)[cite: 1]:

  1. Penambahan Operasi Pembagian (Divide): Tambahkan opsi "Divide (A / B)" pada Combobox dengan menggunakan fungsi cv2.divide()[cite: 23]. Berikan analisis di laporan mengenai penanganan pembagian dengan nol (*division by zero*).
  2. Operasi Pencerahan Skalar (Brightness Adjustment): Tambahkan sebuah slider khusus skalar integer (rentang: $-100$ hingga $+100$) untuk menambah atau mengurangi kecerahan Citra A menggunakan fungsi cv2.add(self.img1, np.array([nilai_slider]))[cite: 23].
  3. Tombol Simpan Hasil (Save Output Image): Tambahkan tombol "Simpan Citra Hasil" yang menggunakan filedialog.asksaveasfilename() dan cv2.imwrite() agar pengguna dapat mengekspor hasil olahan ke format PNG/JPG[cite: 18, 23].

4. Lembar Soal Pengamatan Analitis Mahasiswa[cite: 1]

Setiap kelompok wajib mendiskusikan dan menjawab pertanyaan analitis berikut di dalam laporan[cite: 1]:

Pertanyaan 1: Kasus Modulo Overflow

Lakukan percobaan menambahkan dua gambar pemandangan yang sama-sama memiliki area langit putih terang[cite: 23]. Bandingkan hasil cv2.add(A, B) dengan operator biasa A + B[cite: 23]! Mengapa pada operator biasa area langit yang sangat terang justru berubah menjadi hitam gelap atau bintik-bintik rusak? Sertakan bukti screenshot dan analisis matematis tipe data uint8[cite: 23]!

Pertanyaan 2: Logika Masking Objek

Siapkan Citra A berupa foto wajah/daun, dan Citra B berupa gambar biner (lingkaran putih dengan latar belakang hitam)[cite: 18, 23]. Jelaskan perbedaan prinsip kerja keluaran visual saat memilih operasi AND dibandingkan operasi OR[cite: 23]! Operasi manakah yang berfungsi memotong objek (*cropping mask*) dan manakah yang menempelkan objek[cite: 23]?

Pertanyaan 3: Deteksi Perubahan dengan XOR

Jika Anda memasukkan Citra A dan Citra B yang 100% sama persis, apa hasil keluaran dari operasi XOR dan Subtract (A - B)[cite: 23]? Bagaimana teknik ini dapat dimanfaatkan dalam sistem pengawasan CCTV otomatis untuk mendeteksi gerakan penyusup (*motion detection*)[cite: 1]?

5. Rubrik Penilaian Tugas Praktikum[cite: 1]

Komponen Penilaian Bobot Kriteria Kinerja Unggul
1. Project Coding GUI 30% Program berjalan lancar tanpa error, resize otomatis stabil, slider responsif, dan sukses menambahkan minimal 2 fitur baru[cite: 23].
2. Laporan & Bedah Kode 40% Penjelasan deklarasi kode lengkap dan tepat, analisis saturasi vs modulo logis, serta pembahasan kasus masking mendalam[cite: 1, 23].
3. Video Presentasi Demo 30% Rekaman video interaktif, kualitas audio jelas, mendemonstrasikan fitur modifikasi, dan diunggah ke YouTube kelompok[cite: 1].
Ketentuan Pengumpulan: Berkas dikumpulkan menyesuaikan tugas masing - masing kelompok file dimasukkan ke dalam Google Drive dan LINK di kumpulkan ke dalam LMS dengan status Share LINK [cite: 1].