Spaces:
Sleeping
Sleeping
| 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") | |