Pernahkah kamu penasaran dengan warna dominan yang ada pada sebuah gambar? Warna-warna ini dapat digunakan untuk berbagai keperluan desain, seperti menciptakan skema warna yang harmonis untuk website, branding, atau seni visual. Dalam artikel ini, kita akan membahas bagaimana cara membuat aplikasi Color Palette Generator menggunakan Flask dan algoritma K-Means Clustering.
Color palette adalah kumpulan warna yang dipilih secara khusus untuk menjaga harmoni visual dalam sebuah desain. Contohnya, sebuah gambar dapat memiliki warna dominan seperti biru langit, hijau daun, atau cokelat tanah. Dengan mengekstrak warna dominan dari sebuah gambar, kita dapat dengan mudah membuat skema warna yang cocok untuk berbagai proyek kreatif.
Algoritma K-Means Clustering digunakan untuk menemukan warna dominan dari gambar. Algoritma ini bekerja dengan cara mengelompokkan piksel dalam gambar ke dalam beberapa kelompok (klaster) berdasarkan kemiripan warna. Hasil akhirnya adalah warna-warna centroid dari setiap klaster, yang menjadi warna dominan pada gambar.
Pertama-tama tentu saja kita perlu instal python terlebih dahulu serta beberapa library yang dibutuhkan.
Kita melakukan instalasi menggunakan pip
pip install scikit-learn pandas numpy flask opencv-python matplotlib os
app.py ini merupakan file yang nantinya akan dipanggil untuk menjalankan flask
Pertama-tama, import librarynya
from flask import Flask, render_template, request, redirect, url_for
import os
import cv2
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import matplotlib
Inisialisasi Flask
app = Flask(__name__)
Setting folder yang digunakan untuk upload
app.config['UPLOAD_FOLDER'] = 'static/uploads'
app.config['PALETTE_PATH'] = 'static/palette.png'
Selanjutnya, kita buat fungsi extract_palette yang digunakan untuk melakukan ekstraksi image dan dimasukkan ke K-Means. Untuk ukuran K-nya adalah 5
def extract_palette(image_path, num_clusters=5):
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pixels = image.reshape(-1, 3)
# Apply KMeans
kmeans = KMeans(n_clusters=num_clusters, random_state=0)
kmeans.fit(pixels)
colors = kmeans.cluster_centers_.astype(int)
# Plot palette
palette = np.zeros((50, 300, 3), dtype='uint8')
step = 300 // len(colors)
for i, color in enumerate(colors):
palette[:, i * step:(i + 1) * step, :] = color
plt.figure(figsize=(8, 2))
plt.axis('off')
plt.imshow(palette)
plt.savefig(app.config['PALETTE_PATH'], bbox_inches='tight', pad_inches=0)
plt.close()
Kita buat fungsi untuk routing
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
if 'image' not in request.files:
return redirect(request.url)
file = request.files['image']
if file.filename == '':
return redirect(request.url)
if file:
# Save uploaded image
filepath = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(filepath)
# Generate palette
extract_palette(filepath)
return render_template('index.html', uploaded_image=filepath, palette_image=url_for('static', filename='palette.png'))
return render_template('index.html', uploaded_image=None, palette_image=None)
Fungsi untuk running
if __name__ == '__main__':
app.run(debug=True)
Index.html ini berfungsi untuk tampilan yang nantinya digunakan untuk input
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Color Palette Generator</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
<div class="container py-5">
<div class="text-center mb-5">
<h1 class="display-5 fw-bold">Color Palette Generator</h1>
<p class="lead text-muted">Upload an image to generate its color palette.</p>
</div>
<div class="row justify-content-center">
<div class="col-md-6">
<form method="POST" enctype="multipart/form-data" class="card p-4 shadow-sm">
<div class="mb-3">
<label for="image" class="form-label">Select an Image</label>
<input type="file" class="form-control" id="image" name="image" accept="image/*" required>
</div>
<div class="d-grid">
<button type="submit" class="btn btn-primary">Generate Palette</button>
</div>
</form>
</div>
</div>
{% if uploaded_image %}
<div class="row justify-content-center mt-4">
<div class="col-md-8">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title text-center">Generated Color Palette</h5>
<div class="text-center">
<img src="{{ palette_image }}" alt="Color Palette" class="img-fluid rounded">
</div>
</div>
</div>
</div>
</div>
<div class="row justify-content-center mt-5">
<div class="col-md-8">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title text-center">Uploaded Image</h5>
<div class="text-center">
<img src="{{ uploaded_image }}" alt="Uploaded Image" class="img-fluid rounded">
</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
Jika sudah, demonya adalah sebagai berikut
Kode githubnya di sini : https://github.com/satriahelmy/colorpalette/tree/main
Oke, sekian semoga bermanfaat.