import os import numpy as np from PIL import Image from scipy.signal import convolve2d # Semua file dibaca dan disimpan di folder yang sama dengan program ini, # sehingga program bisa dijalankan di komputer mana pun. FOLDER = os.path.dirname(os.path.abspath(__file__)) def kernel_log(sigma, ukuran=9): """Membuat kernel Laplacian of Gaussian (LoG) berukuran ukuran x ukuran.""" r = ukuran // 2 y, x = np.mgrid[-r:r + 1, -r:r + 1].astype(np.float64) rr = x**2 + y**2 k = -(1.0 / (np.pi * sigma**4)) * (1 - rr / (2 * sigma**2)) * np.exp(-rr / (2 * sigma**2)) k -= k.mean() # jumlah elemen kernel dibuat 0 return k def terapkan_log(img, sigma): return convolve2d(img, kernel_log(sigma), mode="same", boundary="symm") def normalisasi(a): """Skala hasil ke rentang 0-255 agar bisa disimpan sebagai citra.""" a = a - a.min() if a.max() > 0: a = a / a.max() * 255 return a.astype(np.uint8) def simpan(arr, nama): Image.fromarray(normalisasi(arr)).save(os.path.join(FOLDER, nama)) # a. Baca citra (rom.jpeg harus berada di folder yang sama dengan program ini) nama_file = "rom.jpeg" path_citra = os.path.join(FOLDER, nama_file) if not os.path.exists(path_citra): raise FileNotFoundError(f"{nama_file} tidak ditemukan. Taruh di folder: {FOLDER}") img = np.array(Image.open(path_citra).convert("L"), dtype=np.float64) # b. Filter LoG sigma = 0,1 -> im1 im1 = terapkan_log(img, 0.1) simpan(im1, "im1.png") # c. Filter LoG sigma = 0,2 -> im2 im2 = terapkan_log(img, 0.2) simpan(im2, "im2.png") # d. Selisih kedua citra -> citra hasil hasil = im1 - im2 simpan(hasil, "hasil_selisih.png") # Bukti bahwa im1, im2, dan hasil hampir identik setelah dinormalisasi n1, n2, nh = normalisasi(im1), normalisasi(im2), normalisasi(hasil) print("Korelasi im1 vs im2 :", np.corrcoef(n1.ravel(), n2.ravel())[0, 1]) print("Korelasi im1 vs hasil :", np.corrcoef(n1.ravel(), nh.ravel())[0, 1]) print("Selisih rata-rata im1 vs im2 (0-255):", np.abs(n1.astype(int) - n2.astype(int)).mean()) # Sebelum dinormalisasi, ketiga citra hanya berbeda skala for nama, arr in (("im1", im1), ("im2", im2), ("hasil", hasil)): print(f"Rentang nilai mentah {nama:<5}: {arr.min():.1f} s.d. {arr.max():.1f}") print("Selesai. File tersimpan di:", FOLDER)