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)