|
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 |
|
|
|
|
|
st.title("Fast Image Compression using Truncated SVD") |
|
|
|
|
|
uploaded_file = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"]) |
|
if uploaded_file is not None: |
|
|
|
image = io.imread(uploaded_file) |
|
gray_image = color.rgb2gray(image) |
|
|
|
|
|
resized_image = resize_image(gray_image) |
|
|
|
|
|
k = st.slider("Select the rank for compression", min_value=1, max_value=min(resized_image.shape), value=50) |
|
|
|
|
|
compressed_image = truncated_svd_compress(resized_image, k) |
|
|
|
|
|
st.image([gray_image, compressed_image], caption=["Original", "Compressed"]) |