Procesamiento de imagenes en Python
Una buena manera de programar es a partir de ejemplos ya que nos permite investigar o profundizar en algunos conceptos y aplicarlos en dar una solucion a un problema.
Con este psot iniciamos una serie de articulos relaccionados con ejercicios y ejemplos mas o menos avanzados para dominar el lenguaje Python.
En este articulo vamos a dar un enunciado de un problema a solucionar con Python.
Enlace patrocinado
La idea es investigar posibles soluciones a un problema dado y encontrar una solucion correcta.
Usaremos temas avanzados de Python que tengan una cierta complejidad.
El enunciado de ejercicio es
Procesamiento de imagenes en Python en paralelo
Descargar varias imagenes en formato JPG o PNG y guardarlas en una carpeta.
Escribir un programa que procese varias imagenes en paralelo.
El procesamiento consiste en convertir cada imagen en escala de grises, redimensionarla a 600×600 pixeles y despues difuminarla.
El programa debe almacenar las imagenes procesadas en otra carpeta.
Puedes usar la libreria PIL DE python o cuaalquier otra que creas conveniente.
Si quieres puedes indicar tu solucion o propuesta en la seccion de comentarios.
Te indicamos una posible solucion al problema
import os import threading from PIL import Image, ImageFilter # La carpeta que contiene las imรกgenes antes del tratamiento ruta_carpeta_img = 'imagenes_antes_tratamiento/' # La carpeta que contiene las imรกgenes despuรฉs del tratamiento ruta_carpeta_despues_tratamiento = 'imagenes_despues_tratamiento/' # Si la carpeta de salida no existe en la ruta indicada if not os.path.exists(ruta_carpeta_despues_tratamiento): # Creamos la carpeta os.makedirs(ruta_carpeta_despues_tratamiento) # Listamos las imรกgenes contenidas en la carpeta que tengan รบnicamente # las extensiones PNG, JPG o JPEG. lista_archivos_imagenes = [f for f in os.listdir(ruta_carpeta_img) if f.endswith(('png', 'jpg', 'jpeg'))] def tratar_imagen(ruta_img, ruta_salida): """Funciรณn que permite tratar una imagen aplicando una serie de operaciones""" try: # Lectura de una imagen with Image.open(ruta_img) as img_tmp: # Convertimos la imagen a escala de grises img_tmp = img_tmp.convert('L') # Redimensionamos la imagen a un tamaรฑo de 600 x 600 px img_tmp = img_tmp.resize((600, 600)) # Aplicamos un filtro que permite desenfocar la imagen img_tratada = img_tmp.filter(ImageFilter.BLUR) # Guardamos la imagen tratada en la carpeta 'ruta_salida' img_tratada.save(ruta_salida) print(f"La imagen '{ruta_img}' ha sido tratada y guardada en la carpeta '{ruta_salida}'") except Exception as e: print(f"Error al tratar la imagen '{ruta_img}': {e}") # Inicializamos una lista que almacenarรก todos los threads usados # para el tratamiento de todas las imรกgenes lista_threads = [] # Recorremos cada imagen de la carpeta for img in lista_archivos_imagenes: # Inicializaciรณn de las rutas de entrada y salida ruta_entrada_img = os.path.join(ruta_carpeta_img, img) ruta_salida_img = os.path.join(ruta_carpeta_despues_tratamiento, f"tratada_{img}") # Inicializaciรณn de un thread para la imagen actual thread = threading.Thread(target=tratar_imagen, args=( ruta_entrada_img, ruta_salida_img)) # Aรฑadimos este thread a la lista de threads lista_threads.append(thread) # Iniciamos este thread thread.start() # Esperamos que todos los threads finalicen for t in lista_threads: t.join() print("Todas las imรกgenes han sido tratadas.")
Te puede interesar