Jawaban UTS Pengolahan Citra Digital Kelompok I

Soal 1: selisih Laplacian of Gaussian (sigma 0,1 dan 0,2).
Soal 2: memecah teks menjadi karakter individual dengan regionprops.
Soal 3: menghitung jumlah koin per ukuran dengan regionprops.
This commit is contained in:
MelvynFaith
2026-10-22 23:43:56 +07:00
commit 003b2c544c
39 changed files with 1191 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
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)