import streamlit as st import numpy as np from sklearn.decomposition import PCA from PIL import Image # Add a file uploader to allow image uploads uploaded_file = st.file_uploader("Choose an image...", type=['jpg', 'jpeg', 'png']) def process_display_image(uploaded_file): # Load the image and convert it to grayscale original_img = Image.open(uploaded_file).convert('L') img_array = np.array(original_img) # Number of components in the original image original_components = img_array.shape[1] # Number of components to keep for PCA n_components = 20 # Set an initial value for the slider n_components = st.sidebar.slider('Number of PCA Components', 1, original_components, n_components) # Initialize PCA and apply it to the image data pca = PCA(n_components=n_components) pca.fit(img_array) img_transformed = pca.transform(img_array) # Inverse transform to reconstruct the image img_reconstructed = pca.inverse_transform(img_transformed) # Normalize the pixel values to be in the range [0, 255] img_reconstructed = np.clip(img_reconstructed, 0, 255) # Ensures values are within [0, 255] img_reconstructed = img_reconstructed.astype(np.uint8) # Converts the values to uint8 # Number of components in the processed image processed_components = pca.n_components_ # Display the original and the reconstructed images col1, col2 = st.columns(2) with col1: st.image(img_array, caption=f'Original Image\n{original_components} components', use_column_width=True) with col2: st.image(img_reconstructed, caption=f'Reconstructed Image\n{processed_components} components', use_column_width=True) # Check if an image was uploaded before processing it if uploaded_file is not None: process_display_image(uploaded_file) else: st.write("Please upload an image to process.")