es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo dividir un conjunto de datos de imágenes grandes en grupos de imágenes y guardarlos en subcarpetas utilizando Python?

Tengo un conjunto de datos de imágenes que se ve así: Conjunto de datos

El intervalo de tiempo de cada imagen es de 15 minutos (como se puede ver, la marca de tiempo está en el nombre de archivo).

Ahora me gustaría agrupar esas imágenes en secuencias de 3 horas de duración y guardar esas secuencias dentro de subcarpetas que contendrían respectivamente 12 imágenes (= 3 horas).
El resultado idealmente se vería así:
Secuencias

He intentado usar os.walk y hacer un bucle dentro de la carpeta donde se guarda el conjunto de datos de imágenes, luego creé un dataframe usando pandas porque pensé que podría manejar los archivos más fácilmente, pero creo que estoy completamente equivocado aquí.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agrupar las imágenes en secuencias de 3 horas y guardarlas en subcarpetas que contengan 12 imágenes cada una, puedes seguir los siguientes pasos:

    1. Importa los módulos necesarios como os, pandas y datetime para operaciones basadas en el tiempo.
    2. Utiliza la función os.walk para recorrer la carpeta que contiene el conjunto de imágenes.
    3. Crea un diccionario vacío para almacenar las rutas de las imágenes y sus marcas de tiempo.
    4. Utiliza manipulación de cadenas para extraer la marca de tiempo del nombre del archivo y conviértela en un objeto datetime utilizando datetime.strptime.
    5. Almacena la ruta y la marca de tiempo en el diccionario.
    6. Crea una lista de marcas de tiempo y rutas de imágenes ordenando el diccionario por marca de tiempo.
    7. Utiliza un bucle para iterar sobre la lista de marcas de tiempo y crear una lista de 12 imágenes secuenciales que tengan una diferencia de tiempo de 3 horas entre ellas.
    8. Crea subcarpetas para cada grupo de 12 imágenes.
    9. Guarda las imágenes en la subcarpeta correspondiente.

    Aquí tienes un ejemplo de código para implementar los pasos anteriores:

    import os
    import pandas as pd
    from datetime import datetime, timedelta
    
    # Define la ruta de la carpeta que contiene el conjunto de imágenes
    folder_path = "ruta/a/la/carpeta"
    
    # Define el intervalo de tiempo para agrupar las imágenes (3 horas)
    time_interval = timedelta(hours=3)
    
    # Utiliza os.walk para recorrer la carpeta
    image_paths = {}
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith(".jpg"):
                file_path = os.path.join(root, file)
                # Extrae la marca de tiempo del nombre del archivo
                timestamp_str = file.split("_")[1].split(".")[0]
                # Convierte la marca de tiempo en un objeto datetime
                timestamp = datetime.strptime(timestamp_str, "%Y%m%d%H%M%S")
                image_paths[file_path] = timestamp
    
    # Ordena el diccionario por marca de tiempo y extrae las listas de rutas de imágenes y marcas de tiempo
    sorted_dict = sorted(image_paths.items(), key=lambda x: x[1])
    image_paths_list = [item[0] for item in sorted_dict]
    timestamp_list = [item[1] for item in sorted_dict]
    
    # Utiliza un bucle para agrupar las imágenes en secuencias de 3 horas y guardarlas en subcarpetas
    total_images = len(image_paths_list)
    seq_count = 0
    for i in range(0, total_images, 12):
        if i+12 > total_images:
            break # salir del bucle si quedan menos de 12 imágenes
        seq_count += 1
        # Crea la subcarpeta para la secuencia
        seq_folder_path = os.path.join(folder_path, f"Secuencia{seq_count}")
        os.mkdir(seq_folder_path)
        # Guarda las 12 imágenes en la subcarpeta
        for j in range(i, i+12):
            image_path = image_paths_list[j]
            timestamp = timestamp_list[j]
            image_filename = os.path.basename(image_path)
            dest_filename = f"{seq_count}_{j-i+1}_{image_filename}"
            dest_path = os.path.join(seq_folder_path, dest_filename)
            os.rename(image_path, dest_path)
    

    Después de ejecutar el código anterior, deberías tener las imágenes agrupadas en secuencias de 3 horas y guardadas en subcarpetas que contienen 12 imágenes cada una, como se muestra en la imagen de salida deseada.

Comments are closed.