๐Ÿ“™Lab 3

Klasterisasi Pada Kompresi Citr

Pengantar

Klasterisasi tidak hanya dapat digunakan pada data tabular. Pada konteks citra, kita dapat menggunakan klasterisasi untuk mengidentifkasi kesamaan warna dari sebuah citra sehingga kita mendapatkan area-area tertentu untuk identifikasi lebih lanjut. Kasus lainnya adalah kompresi warna citra. Pada kompresi warna citra, kita akan meminimalkan penggunaan rentang citra untuk mendapatkan citra dengan ukuran data yang lebih rendah.

Langkah 0 - Import Library

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

Langkah 1 - Load Data Citra

Kita akan mencoba menggunakan 1 data citra dari dataset yang telah disediakan

from sklearn.datasets import load_sample_image
flower = load_sample_image("flower.jpg")
ax = plt.axes(xticks=[], yticks=[])
ax.imshow(flower)

Hasilnya adalah,

Langkah 2 - Preprocessing

Selanjutnya kita akan melakukan pengecekan ukuran citra dan normalisasi warna

# Check shape
print(flower.shape)

# Normalize color
data = flower / 255.0

# Reshape
data = data.reshape(427 * 640, 3) # turn to 1D

print(data.shape)

Langkah 3 - Cek Sebaran Warna

Buat fungsi berikut,

def plot_pixels(data, title, colors=None, N=10000):
    if colors is None:
        colors = data
    
    # choose a random subset
    rng = np.random.RandomState(0)
    i = rng.permutation(data.shape[0])[:N]
    colors = colors[i]
    R, G, B = data[i].T
    
    fig, ax = plt.subplots(1, 2, figsize=(16, 6))
    ax[0].scatter(R, G, color=colors, marker='.')
    ax[0].set(xlabel='Red', ylabel='Green', xlim=(0, 1), ylim=(0, 1))

    ax[1].scatter(R, B, color=colors, marker='.')
    ax[1].set(xlabel='Red', ylabel='Blue', xlim=(0, 1), ylim=(0, 1))

    fig.suptitle(title, size=20);

Panggil fungsi untuk mengetahui sebaran warna,

plot_pixels(data, title='Input color space: 16 million possible colors')

Akan muncul grafik seperti di bawah ini,

Langkah 4 - Klasterisasi Warna

Pada tahap ini kita akan melakukan klasterisasi hanya dengan 16 warna saja.

from sklearn.cluster import MiniBatchKMeans

kmeans = MiniBatchKMeans(16)
kmeans.fit(data)
new_colors = kmeans.cluster_centers_[kmeans.predict(data)]

plot_pixels(data, colors=new_colors,title="Reduced color space: 16 colors")

Didapatkan,

Hasil perbandingan warna citra sebelum dan setelah kompresi adalah sebagai berikut,

flower_recolored = new_colors.reshape(flower.shape)

fig, ax = plt.subplots(1, 2, figsize=(16, 6),
                       subplot_kw=dict(xticks=[], yticks=[]))
fig.subplots_adjust(wspace=0.05)
ax[0].imshow(flower)
ax[0].set_title('Original Image', size=16)
ax[1].imshow(flower_recolored)
ax[1].set_title('16-color Image', size=16);

Last updated