NaimaAqeel's picture
Update app.py
f51b0f2 verified
raw
history blame
1.75 kB
import numpy as np
from skimage import io, color
from skimage.transform import resize
from sklearn.decomposition import TruncatedSVD
import streamlit as st
def resize_image(image, target_shape=(500, 500)):
"""Resize image to reduce processing time."""
return resize(image, target_shape, anti_aliasing=True)
def truncated_svd_compress(image, k):
"""Compress the image using Truncated SVD by keeping only the top k singular values."""
svd = TruncatedSVD(n_components=k)
U = svd.fit_transform(image)
V = svd.components_
S = svd.singular_values_
compressed_image = np.dot(U, np.dot(np.diag(S), V))
return compressed_image
# Streamlit app
st.title("Fast Image Compression using Truncated SVD")
# Upload an image
uploaded_file = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"])
if uploaded_file is not None:
# Load the image
image = io.imread(uploaded_file)
gray_image = color.rgb2gray(image)
# Resize the image for faster processing
resized_image = resize_image(gray_image)
# Select compression rank
k = st.slider("Select the rank for compression", min_value=1, max_value=min(resized_image.shape), value=50)
# Compress the image using Truncated SVD
compressed_image = truncated_svd_compress(resized_image, k)
# Normalize the images for display
gray_image_display = (resized_image - resized_image.min()) / (resized_image.max() - resized_image.min())
compressed_image_display = (compressed_image - compressed_image.min()) / (compressed_image.max() - compressed_image.min())
# Display original and compressed images
st.image([gray_image_display, compressed_image_display], caption=["Original", "Compressed"], use_column_width=True)