Spaces:
Sleeping
Sleeping
import streamlit as st | |
import cv2 | |
import numpy as np | |
from PIL import Image | |
import io | |
import os | |
# Function to sharpen the image | |
def sharpen_image(image, strength): | |
kernel = np.array([[0, -strength, 0], | |
[-strength, 1 + 4 * strength, -strength], | |
[0, -strength, 0]]) | |
sharpened = cv2.filter2D(image, -1, kernel) | |
return sharpened | |
# Function to smooth the image | |
def smooth_image(image, strength): | |
ksize = int(2 * round(strength) + 1) # Kernel size must be odd | |
smoothed = cv2.GaussianBlur(image, (ksize, ksize), 0) | |
return smoothed | |
# Streamlit App | |
st.title("Image Sharpening and Smoothing Tool") | |
# File uploader | |
uploaded_file = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"]) | |
if uploaded_file: | |
# Read the uploaded image | |
original_name = os.path.splitext(uploaded_file.name)[0] # Extract file name without extension | |
image = Image.open(uploaded_file) | |
image_array = np.array(image) | |
# Display the original image | |
st.subheader("Original Image") | |
st.image(image_array, channels="RGB") | |
# Choose between sharpening or smoothing | |
choice = st.radio("Choose an option:", ["Sharpen", "Smooth"]) | |
# Slider for strength adjustment | |
if choice == "Sharpen": | |
strength = st.slider("Sharpening Strength", min_value=0.0, max_value=2.0, value=0.5, step=0.1) | |
processed_image = sharpen_image(image_array, strength) | |
suffix = "_sharpened" | |
else: | |
strength = st.slider("Smoothing Strength", min_value=1.0, max_value=10.0, value=3.0, step=1.0) | |
processed_image = smooth_image(image_array, strength) | |
suffix = "_smoothed" | |
# Display the processed image | |
st.subheader("Processed Image") | |
st.image(processed_image, channels="RGB") | |
# Convert the processed image to PIL format for downloading | |
processed_pil_image = Image.fromarray(processed_image) | |
if processed_pil_image.mode != "RGB": | |
processed_pil_image = processed_pil_image.convert("RGB") | |
# Prepare the image for download | |
buffer = io.BytesIO() | |
processed_pil_image.save(buffer, format="JPEG") | |
buffer.seek(0) | |
# Set the download filename | |
download_filename = f"{original_name}{suffix}.jpg" | |
# Download button | |
st.download_button( | |
label="Download Processed Image", | |
data=buffer, | |
file_name=download_filename, | |
mime="image/jpeg" | |
) | |