import numpy as np import random import streamlit as st import cv2 from PIL import Image import base64 from io import BytesIO import zipfile st.markdown(""" """, unsafe_allow_html=True) def encode_image(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode() def add_bg_from_local(image_file): encoded_string = encode_image(image_file) st.markdown( f""" """, unsafe_allow_html=True ) add_bg_from_local("Images/Gemini_Generated_Image_pnb6j1pnb6j1pnb6.jpg") st.sidebar.header("Augmentation Options") apply_translation = st.sidebar.checkbox("Apply Translation", value=True) apply_rotation = st.sidebar.checkbox("Apply Rotation", value=True) apply_brightness = st.sidebar.checkbox("Apply Brightness Adjustment", value=True) if apply_brightness: brightness_mode = st.sidebar.radio( "Brightness Adjustment Mode", options=["Increase Brightness", "Decrease Brightness", "Random Adjustment"], index=2 ) if brightness_mode == "Increase Brightness": brightness_range = (1.0, 2.0) elif brightness_mode == "Decrease Brightness": brightness_range = (0.1, 1.0) elif brightness_mode == "Random Adjustment": st.sidebar.header("Random Adjustment Settings") brightness_min = st.sidebar.slider( "Minimum brightness factor", min_value=0.1, max_value=1.0, value=0.7, key="brightness_min_random" ) brightness_max = st.sidebar.slider( "Maximum brightness factor", min_value=1.0, max_value=2.0, value=1.3, key="brightness_max_random" ) if brightness_min >= brightness_max: st.sidebar.error("Minimum brightness factor must be less than maximum brightness factor.") brightness_range = (brightness_min, brightness_max) def augment_image(image, tx_range=30, angle_range=15, brightness_range=(0.7, 1.3)): rows, cols, _ = image.shape augmented_image = image.copy() if apply_translation: tx = random.randint(-tx_range, tx_range) ty = random.randint(-tx_range, tx_range) translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]]) augmented_image = cv2.warpAffine(augmented_image, translation_matrix, (cols, rows)) if apply_rotation: angle = random.randint(-angle_range, angle_range) rotation_matrix = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, 1) augmented_image = cv2.warpAffine(augmented_image, rotation_matrix, (cols, rows)) if apply_brightness: factor = random.uniform(*brightness_range) augmented_image = cv2.convertScaleAbs(augmented_image, alpha=factor, beta=0) return augmented_image def display_images_in_grid(images, cols=3): rows = (len(images) + cols - 1) // cols for row in range(rows): cols_to_display = images[row * cols : (row + 1) * cols] columns = st.columns(len(cols_to_display)) for col, img in zip(columns, cols_to_display): with col: st.image(img, channels="RGB", use_container_width=True) st.title("Image Augmentation App") st.write("Upload an image and generate augmented images. For more control, use Advanced Settings.") uploaded_file = st.file_uploader("Choose an image", type=["jpg", "jpeg", "png"]) if uploaded_file is not None: image = Image.open(uploaded_file) image_array = np.array(image) st.image(image, caption="Original Image", use_container_width=True) num_augmentations = st.sidebar.number_input("Number of augmented images", min_value=1, max_value=200, value=5, step=1) advanced_settings = st.sidebar.checkbox("Advanced Settings") tx_range = 30 angle_range = 15 brightness_range = (0.7, 1.3) if advanced_settings: st.sidebar.header("Augmentation Settings") tx_range = st.sidebar.slider("Translation range (pixels)", min_value=0, max_value=100, value=30, key="tx_range") angle_range = st.sidebar.slider("Rotation range (degrees)", min_value=0, max_value=90, value=15, key="angle_range") if not (apply_brightness and brightness_mode == "Random Adjustment"): if advanced_settings: brightness_min = st.sidebar.slider( "Minimum brightness factor", min_value=0.1, max_value=1.0, value=0.7, key="brightness_min_advanced" ) brightness_max = st.sidebar.slider( "Maximum brightness factor", min_value=1.0, max_value=2.0, value=1.3, key="brightness_max_advanced" ) if brightness_min >= brightness_max: st.sidebar.error("Minimum brightness factor must be less than maximum brightness factor.") brightness_range = (brightness_min, brightness_max) if apply_translation or apply_rotation or apply_brightness: if st.sidebar.button("Generate Augmented Images"): st.write("Augmented Images:") augmented_images = set() unique_images = [] while len(unique_images) < num_augmentations: augmented_image = augment_image(image_array.copy(), tx_range, angle_range, brightness_range) image_hash = hash(augmented_image.tobytes()) if image_hash not in augmented_images: augmented_images.add(image_hash) unique_images.append(augmented_image) st.session_state.unique_images = unique_images display_images_in_grid(unique_images, cols=3) if unique_images: zip_buffer = BytesIO() with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_file: for i, aug_img in enumerate(unique_images): aug_img = cv2.cvtColor(aug_img, cv2.COLOR_BGR2RGB) _, img_encoded = cv2.imencode(".jpg", aug_img) zip_file.writestr(f"augmented_image_{i + 1}.jpg", img_encoded.tobytes()) zip_buffer.seek(0) st.download_button( label="Download Augmented Images as ZIP", data=zip_buffer.getvalue(), file_name="augmented_images.zip", mime="application/zip", ) else: if st.sidebar.button("Generate Augmented Images"): st.warning("No augmentation options selected. Please select at least one option (Translation, Rotation, or Brightness).")