Spaces:
Sleeping
Sleeping
File size: 2,632 Bytes
4480055 9cd3fca 4480055 9cd3fca 4480055 |
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 55 56 57 58 59 60 61 |
import streamlit as st
import numpy as np
from sklearn.cluster import KMeans
from io import BytesIO
from PIL import Image
import base64
def compress_image_kmeans(image, k):
# Convert PIL image to NumPy array
img = np.array(image)
h, w, c = img.shape
# Reshape the image into a 2D array of pixels
img_reshaped = img.reshape(-1, c)
# Apply K-Means clustering
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
labels = kmeans.fit_predict(img_reshaped)
# Replace pixel values with cluster centers
compressed_img = kmeans.cluster_centers_[labels].reshape(h, w, c).astype(np.uint8)
return Image.fromarray(compressed_img)
def get_image_download_link(img, filename="compressed_image.png"):
buffered = BytesIO()
img.save(buffered, format="PNG")
encoded = base64.b64encode(buffered.getvalue()).decode()
href = f'<a href="data:file/png;base64,{encoded}" download="{filename}">Download Compressed Image</a>'
return href
def main():
st.title("Image Compression using K-Means Clustering")
# Instructions Section
st.header("About the App")
st.write("This application allows you to compress images using K-Means clustering. By reducing the number of colors in the image, the app creates a simplified version while maintaining its visual integrity.")
st.header("How to Use")
st.write("1. Upload one or multiple images using the file uploader below.")
st.write("2. Adjust the slider to select the number of colors (clusters) for compression.")
st.write("3. Click the 'Compress' button to process the image.")
st.write("4. Download the compressed image using the provided link.")
uploaded_files = st.file_uploader("Choose images", type=["png", "jpg", "jpeg"], accept_multiple_files=True)
if uploaded_files:
for uploaded_file in uploaded_files:
image = Image.open(uploaded_file)
st.image(image, caption=f"Original Image - {uploaded_file.name}", use_container_width=True)
k = st.slider(f"Select number of colors (clusters) for {uploaded_file.name}", min_value=2, max_value=64, value=16)
if st.button(f"Compress {uploaded_file.name}"):
compressed_img = compress_image_kmeans(image, k)
st.image(compressed_img, caption=f"Compressed Image - {uploaded_file.name}", use_container_width=True)
st.markdown(get_image_download_link(compressed_img, filename=f"compressed_{uploaded_file.name}"), unsafe_allow_html=True)
if __name__ == "__main__":
main() |