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.
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
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) |