Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image | |
| from io import BytesIO | |
| st.set_page_config(page_title="Grayscale Image Converter", layout="centered") | |
| st.title("🖼️ Grayscale Image Converter with Filters & Resize") | |
| st.write("Upload an image, apply filters, resize it, and download the grayscale version!") | |
| # Upload image | |
| uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"]) | |
| if uploaded_file is not None: | |
| # Convert uploaded file to numpy array | |
| file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8) | |
| image = cv2.imdecode(file_bytes, 1) # Load image in color (BGR) | |
| # Convert to grayscale | |
| gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
| # Convert OpenCV images to PIL format for Streamlit display | |
| image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) | |
| original_pil = Image.fromarray(image_rgb) | |
| gray_pil = Image.fromarray(gray_image) | |
| # Show original and grayscale images side-by-side | |
| st.subheader("Original vs Grayscale Image") | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.image(original_pil, caption="Original Image", use_column_width=True) | |
| with col2: | |
| st.image(gray_pil, caption="Grayscale Image", use_column_width=True) | |
| # Filter options | |
| st.subheader("Apply Filters") | |
| filter_option = st.selectbox( | |
| "Choose a filter to apply", | |
| ["None", "Gaussian Blur", "Sharpen", "Edge Detection"] | |
| ) | |
| if filter_option == "Gaussian Blur": | |
| image = cv2.GaussianBlur(image, (15, 15), 0) | |
| gray_image = cv2.GaussianBlur(gray_image, (15, 15), 0) | |
| elif filter_option == "Sharpen": | |
| kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]]) | |
| image = cv2.filter2D(image, -1, kernel) | |
| gray_image = cv2.filter2D(gray_image, -1, kernel) | |
| elif filter_option == "Edge Detection": | |
| image = cv2.Canny(image, 100, 200) | |
| gray_image = cv2.Canny(gray_image, 100, 200) | |
| # Resize options | |
| st.subheader("Resize Image") | |
| width = st.slider("Select width", 50, 500, 300) | |
| height = int((width / original_pil.width) * original_pil.height) | |
| resized_image = cv2.resize(image, (width, height)) | |
| resized_gray_image = cv2.resize(gray_image, (width, height)) | |
| # Display filtered and resized images | |
| st.subheader("Filtered & Resized Image") | |
| filtered_resized_rgb = cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB) | |
| filtered_resized_pil = Image.fromarray(filtered_resized_rgb) | |
| filtered_resized_gray_pil = Image.fromarray(resized_gray_image) | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.image(filtered_resized_pil, caption="Filtered Resized Image", use_column_width=True) | |
| with col2: | |
| st.image(filtered_resized_gray_pil, caption="Filtered Resized Grayscale", use_column_width=True) | |
| # Convert filtered grayscale image to bytes for download | |
| buf = BytesIO() | |
| filtered_resized_gray_pil.save(buf, format="PNG") | |
| byte_im = buf.getvalue() | |
| # Add download button | |
| st.download_button( | |
| label="📥 Download Filtered & Resized Grayscale Image", | |
| data=byte_im, | |
| file_name="filtered_resized_grayscale_image.png", | |
| mime="image/png" | |
| ) | |