import streamlit as st import numpy as np import pandas as pd import os import zipfile import cv2 st.markdown(""" """, unsafe_allow_html=True) # Main Heading st.markdown('

Generate Augmented Images

', unsafe_allow_html=True) st.markdown("

", unsafe_allow_html=True) #st.markdown('

Upload the image

', unsafe_allow_html=True) # Upload image uploaded_file = st.file_uploader("Upload an image...", type=["jpg", "jpeg", "png"]) image_count=st.number_input("Number of Images to be generated",1,50,placeholder="Type a number...") st.write("Select the Affine Transformation to be applied:") trans = st.checkbox("Translation") rot = st.checkbox("Rotation") scal = st.checkbox("Scaling") shear=st.checkbox("Shearing") crop=st.checkbox("Crop") transformation=[] btn=st.button("Preview Image") #sub=st.button("Preview Image") def clear_folder(folder_name="output_images"): if os.path.exists(folder_name): for file in os.listdir(folder_name): file_path=os.path.join(folder_name,file) if os.path.isfile(file_path): os.remove(file_path) else: os.makedirs(folder_name) def save_image_and_show(image, folder_name="output_images"): if not os.path.exists(folder_name): os.makedirs(folder_name) image_name = f"image_{len(os.listdir(folder_name)) + 1}.jpg" image_path = os.path.join(folder_name, image_name) # Save the image cv2.imwrite(image_path, image) if btn: # Showing the success message st.success(f"Image saved to {image_path} (local path)") # Show the image to the user (not the path) st.image(image, caption="Saved Image", channels="BGR") def zip_file(folder_name="output_images"): zip_filename = f"{folder_name}.zip" with zipfile.ZipFile(zip_filename, 'w') as zipf: for root, dirs, files in os.walk(folder_name): for file in files: filepath = os.path.join(root, file) arcname = os.path.relpath(filepath, folder_name) zipf.write(filepath, arcname) # Read zip for download with open(zip_filename, "rb") as f: st.download_button( label="Download All Images as ZIP", data=f, file_name=zip_filename, mime="application/zip" ) def translation(img,n=5): for i in range(n): tx=np.random.randint(2,50) ty=np.random.randint(1,50) tm=np.array([[1,0,tx],[0,1,ty]],dtype=np.float32) trans_img=cv2.warpAffine(img,tm,dsize=(img.shape[1],img.shape[0]),borderMode=cv2.BORDER_REFLECT) #img_trans_rgb = cv2.cvtColor(trans_img, cv2.COLOR_BGR2RGB) save_image_and_show(trans_img) #st.image(img_trans_rgb, caption="Translation Applied", use_container_width=True) def rotation(img,n=5): for i in range(n): angle=np.random.choice([30,45,90, 180, -90,-30,-45]) scale=np.round(np.random.uniform(1,1.6),2) r_x=img.shape[0]//2 r_y=img.shape[1]//2 rm=cv2.getRotationMatrix2D((r_y,r_x),angle,scale) r_img=cv2.warpAffine(img,rm,(img.shape[1],img.shape[0])) #img_rot_rgb = cv2.cvtColor(r_img, cv2.COLOR_BGR2RGB) save_image_and_show(r_img) #st.image(img_rot_rgb, caption="Rotation Applied", use_container_width=True) def scaling(img,n=5): for i in range(n): sx=np.random.uniform(1,2) sy=np.random.uniform(1,2) tx=np.random.randint(1,16) ty=np.random.randint(1,12) sm=np.array([[sx,0,tx],[0,sy,ty]],dtype=np.float32) s_img=cv2.warpAffine(img,sm,(img.shape[1],img.shape[0])) #img_scal_rgb=cv2.cvtColor(s_img,cv2.COLOR_BGR2RGB) save_image_and_show(s_img) #st.image(img_scal_rgb, caption="Scaling Applied", use_container_width=True) def shearing(img,n=5): for i in range(n): sx=np.round(np.random.uniform(1,1.5),2) shx=np.round(np.random.uniform(0,0.5)) tx=np.random.randint(1,10) shy=np.round(np.random.uniform(0,0.5)) sy=np.round(np.random.uniform(1,1.2),2) ty=np.random.randint(1,15) shm=np.array([[sx,shx,tx],[shy,sy,ty]],dtype=np.float32) img_shear=cv2.warpAffine(img,shm,(img.shape[1],img.shape[0]),borderMode=cv2.BORDER_REFLECT) save_image_and_show(img_shear) #img_shear_rgb=cv2.cvtColor(img_all,cv2.COLOR_BGR2RGB) #st.image(img_shear_rgb, caption="Shearing Applied", use_container_width=True) def cropping(img,n=5): for i in range(n): x_1=np.random.randint(20,60) y_1=np.random.randint(110,160) x_2=np.random.randint(20,60) y_2=np.random.randint(110,160) img_crop=img[x_1:y_1,x_2:y_2] save_image_and_show(img_crop) # img_crop_rgb=cv2.cvtColor(img_crop,cv2.COLOR_BGR2RGB) # st.image(img_crop_rgb, caption="Shearing Applied", use_container_width=True) # def save_image(image, folder_name="output_images"): # if not os.path.exists(folder_name): # os.makedirs(folder_name) # image_name = f"image_{len(os.listdir(folder_name)) + 1}.jpg" # image_path = os.path.join(folder_name, image_name) # cv2.imwrite(image_path, image) # st.success(f"Image saved to {image_path}") if uploaded_file is not None: # Converting the image into array img_array=np.asarray(bytearray(uploaded_file.read()),dtype=np.uint8) # Decode or converting the array back to image array img=cv2.imdecode(img_array,cv2.IMREAD_COLOR) # # Convert BGR to RGB as streamlit expects RGB colorspace # img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) transformation = [] if trans: transformation.append("Translation") if rot: transformation.append("Rotation") if scal: transformation.append("Scaling") if shear: transformation.append("Shearing") if crop: transformation.append("Crop") if transformation: clear_folder() # per_trans = max(1,(image_count // len(transformation))) # trans_count=[per_trans+1 if (per_trans * len(transformation))!= image_count else per_trans][0] num_trans = len(transformation) base = image_count // num_trans remainder = image_count % num_trans # Create a list like [base+1, base, base, ...] to ensure sum == image_count counts = [base + 1 if i < remainder else base for i in range(num_trans)] # if "Translation" in transformation: # translation(img,trans_count) # if "Rotation" in transformation: # rotation(img, per_trans) # if "Scaling" in transformation: # scaling(img, per_trans) # if "Shearing" in transformation: # shearing(img, per_trans) # if "Crop" in transformation: # cropping(img, per_trans) for t_name, t_count in zip(transformation, counts): if t_name == "Translation": translation(img, t_count) elif t_name == "Rotation": rotation(img, t_count) elif t_name == "Scaling": scaling(img, t_count) elif t_name == "Shearing": shearing(img, t_count) elif t_name == "Crop": cropping(img, t_count) zip_file() #st.download_button("Download File",img_rgb) # # Displaying image in streamlit # st.image(img_rgb, caption="Uploaded Image (OpenCV)", use_container_width=True)