Ruang Warna dan Operasi Piksel , Logika dan Aritmatika
Bedah Deklarasi Kode & Panduan Tugas GUI Operasi Aritmatika & Logika Citra
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.
2. Penjelasan Lengkap Tiap Deklarasi Program (Source Code Breakdown)
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:filedialogmembuka jendela jelajah file di sistem operasi,messageboxmemunculkan pop-up dialog/peringatan, danttkmenyediakan 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].
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 denganNoneagar sistem dapat mengecek validasi apakah pengguna sudah memilih gambar atau belum sebelum komputasi dieksekusi[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].
# 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()vsNumPy +: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]:
Bertanggung jawab menjalankan source code Python, memperbaiki kendala dependensi lokal, serta mengimplementasikan minimal 2 fitur modifikasi baru ke dalam program GUI[cite: 1, 23].
Menyusun dokumen laporan praktikum format PDF: membedah deklarasi kode, menyajikan screenshot pengujian, menganalisis perbedaan matematis, dan menarik kesimpulan[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]:
- Penambahan Operasi Pembagian (Divide): Tambahkan opsi
"Divide (A / B)"pada Combobox dengan menggunakan fungsicv2.divide()[cite: 23]. Berikan analisis di laporan mengenai penanganan pembagian dengan nol (*division by zero*). - 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]. - Tombol Simpan Hasil (Save Output Image): Tambahkan tombol "Simpan Citra Hasil" yang menggunakan
filedialog.asksaveasfilename()dancv2.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]:
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]!
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]?
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]. |