Spaces:
Sleeping
Sleeping
File size: 2,194 Bytes
e1b5578 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import streamlit as st
import numpy as np
import cv2
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from io import BytesIO
# Title and description
st.title("🎨 Automatic Color Palette Generator")
st.write("Upload an image to extract its dominant colors.")
# File uploader for user to upload an image
uploaded_file = st.file_uploader("Choose an image", type=["jpg", "png", "jpeg"])
if uploaded_file:
# Read and display the image
file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8)
image = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
st.image(image, caption="Uploaded Image", use_container_width=True)
# User selects the number of colors to extract
num_colors = st.slider("Select number of colors", min_value=3, max_value=10, value=5)
if st.button("Extract Colors"):
# Reshape the image into a 2D array of pixels
image_reshape = image.reshape((-1, 3))
# Apply K-Means clustering to find dominant colors
kmeans = KMeans(n_clusters=num_colors, random_state=42, n_init=10)
kmeans.fit(image_reshape)
colors = kmeans.cluster_centers_.astype(int)
# Display extracted colors as a color bar
st.subheader("Extracted Colors")
fig, ax = plt.subplots(figsize=(num_colors, 1))
ax.imshow([colors / 255])
ax.set_xticks([])
ax.set_yticks([])
st.pyplot(fig)
# Convert colors to HEX format and display RGB values
hex_colors = ['#{:02x}{:02x}{:02x}'.format(*color) for color in colors]
for i, hex_color in enumerate(hex_colors):
st.markdown(f"**Color {i+1}:** `{hex_color}` (RGB: {tuple(colors[i])})")
# Allow user to download the color palette as a text file
if st.button("Download Palette as TXT"):
palette_text = "\n".join([f"{hex_color} - RGB{tuple(colors[i])}" for i, hex_color in enumerate(hex_colors)])
b = BytesIO()
b.write(palette_text.encode())
b.seek(0)
st.download_button("Download Palette", b, file_name="color_palette.txt", mime="text/plain")
|