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
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