File size: 1,748 Bytes
e38bf4d 014d1cd aec5ec6 014d1cd e38bf4d 014d1cd aec5ec6 014d1cd aec5ec6 014d1cd aec5ec6 014d1cd aec5ec6 f51b0f2 014d1cd f51b0f2 |
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 |
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) |