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:
@@ -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)
|
||||
Reference in New Issue
Block a user