stream_demo / src /streamlit_app.py
beaunix's picture
refactor app.py and dockerfile to increase the weight of file upload
3f2722f
Raw
History Blame Contribute Delete
3.49 kB
import streamlit as st
import cv2
import numpy as np
from PIL import Image
# Configuración de la página con límite de carga
st.set_page_config(
page_title="CV Edge Detector - Beau's Lab",
layout="wide"
)
# Configuración para Hugging Face Spaces
MAX_FILE_SIZE = 5 * 1024 * 1024 # 5 MB en bytes
def process_image(image, low_threshold, high_threshold):
"""
Aplica el algoritmo de Canny para detección de bordes.
"""
# Convertir imagen de PIL a formato OpenCV (numpy array BGR)
img_array = np.array(image.convert('RGB'))
img_cv = cv2.cvtColor(img_array, cv2.COLOR_RGB2BGR)
# Convertir a escala de grises
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
# Aplicar Canny
edges = cv2.Canny(gray, low_threshold, high_threshold)
return edges
def main():
st.set_page_config(page_title="CV Edge Detector - Beau's Lab", layout="wide")
st.title("🛠️ Computer Vision Lab: Edge Detection")
st.write("Bienvenido. Sube una imagen para analizar sus gradientes espaciales.")
# Sidebar para parámetros (Hiperparámetros del algoritmo)
st.sidebar.header("Configuración de Algoritmo")
low_thresh = st.sidebar.slider("Umbral Bajo (Low)", 0, 255, 100)
high_thresh = st.sidebar.slider("Umbral Alto (High)", 0, 255, 200)
uploaded_file = st.file_uploader("Elige una imagen...( max size 4MB )", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
# Validar tamaño del archivo
file_size = uploaded_file.size
if file_size > MAX_FILE_SIZE:
st.error(f"⚠️ El archivo es demasiado grande ({file_size / 1024 / 1024:.2f} MB). Por favor, sube una imagen menor a 5 MB.")
return
try:
# Cargar imagen
image = Image.open(uploaded_file)
# Redimensionar si es muy grande (optimización adicional)
max_dimension = 1920
if max(image.size) > max_dimension:
st.warning(f"Imagen grande detectada. Redimensionando para mejor rendimiento...")
ratio = max_dimension / max(image.size)
new_size = tuple([int(x * ratio) for x in image.size])
image = image.resize(new_size, Image.Resampling.LANCZOS)
# Crear dos columnas para comparar
col1, col2 = st.columns(2)
with col1:
st.header("Imagen Original")
st.image(image, use_container_width=True)
with col2:
st.header("Detección de Bordes (Canny)")
# Procesamiento
with st.spinner('Procesando...'):
processed_img = process_image(image, low_thresh, high_thresh)
st.image(processed_img, use_container_width=True, clamp=True)
st.success("¡Procesamiento completado con éxito!")
except Exception as e:
st.error(f"Error al procesar la imagen: {str(e)}")
st.info("Por favor, intenta con otra imagen.")
else:
st.info("Esperando que se suba una imagen...")
st.markdown("""
### Instrucciones:
- Formatos soportados: JPG, JPEG, PNG
- Tamaño máximo: 5 MB
- Para mejores resultados, usa imágenes con objetos definidos
""")
if __name__ == "__main__":
main()