Skip to content

Revisión automática de la práctica 03-borrosa

Este es el resultado de una revisión automática de la prácica 03-borrosa, tal y como la hemos recogido de este repositorio de entrega. Por favor, ten en cuenta que al ser una revisión automática, realizada en parte con la ayuda de un asistente de inteligencia artificial generativa, puede incluir errores, y ser incorrecta. Pero leela con atención, porque creemos que puede tener información útil. Si tienes cualquier duda, o crees que la revisión es errónea, por favor, consulta con los profesores de la asignatura.


Comprobación de archivos con extension '.py'

  • Archivos Python excluidos de la búsqueda: pixels.py
  • Archivos Python encontrados (excluyendo esos): difumina.py

Correcto, se elige difumina.py como entrega.

Comprobación con ficheros de solución

Los archivos son diferentes de los de la solución.

Prueba automática del programa

Pruebas realizadas por 03-borrosa/tests/test_difumina.py:

***ERROR:***
 Error ejecutando los tests: Command '['python3', '-m', 'unittest', 'test_difumina.py']' timed out after 30 seconds

Revisión automática de programa

Programa revisado:

import pixels

def lee_argumentos():
    try:
        imagen = input("Introduce el nombre del archivo .gif (ej. cafe_small.gif): ")
        etapas = int(input("Introduce el número de etapas de difusión (ej. 5): "))
    except ValueError:
        print("Número de etapas debe ser un entero:")
        print("Uso: difumina.py <imagen> <etapas>")
        exit()

    return imagen, etapas

def emborrona():
    imagen_actual = []
    for x in range(pixels.ancho):
        fila_actual = []
        for y in range(pixels.alto):
            (r, g, b) = pixels.lee(x, y)
            r_final = r
            g_final = g
            b_final = b
            contador = 1
            colores_vecinos = [(-1, 0), (1, 0), (0, -1), (0, 1)]

            for dx, dy in colores_vecinos:
                try:
                    (vr, vg, vb) = pixels.lee(x + dx, y + dy)
                    r_final += vr
                    g_final += vg
                    b_final += vb
                    contador += 1
                except IndexError:
                    continue

            avg_r = r_final // contador
            avg_g = g_final // contador
            avg_b = b_final // contador
            fila_actual.append((avg_r, avg_g, avg_b))
        imagen_actual.append(fila_actual)

    for x in range(pixels.ancho):
        for y in range(pixels.alto):
            pixels.pinta(x, y, imagen_actual[x][y])

def main():
    imagen, etapas = lee_argumentos()
    try:
        pixels.prepara(imagen)
    except FileNotFoundError:
        print(f"Fichero de imagen no encontrado: {imagen}")
        print("Uso: difumina.py <imagen> <etapas>")
        exit()
    pixels.actualiza()
    for etapa in range(etapas):
        pixels.actualiza()
        print(f"Etapa {etapa + 1}")
        emborrona()
    pixels.espera()

if __name__ == "__main__":
    main()

Análisis

Cumple con el enunciado

El programa no cumple con varios requisitos clave del enunciado:

  • Argumentos incorrectos: El programa usa input() para solicitar datos al usuario, pero el enunciado exige que los argumentos se reciban por línea de comandos (ej: python difumina.py cafe.gif 5). Esto hace que el programa no funcione como se especifica y no valide correctamente el número de argumentos.
  • Algoritmo de difusión erróneo: Al calcular el promedio, incluye el píxel actual en la suma (inicia r_final = r, g_final = g, b_final = b), pero el enunciado indica que solo deben promediarse los píxeles vecinos (arriba, abajo, izquierda, derecha), sin contar el píxel central. Esto distorsiona el resultado.
  • Mensajes de error incompletos: En el ValueError, no se muestra el valor inválido introducido (ej: hola), como exige el ejemplo del enunciado (Número de etapas debe ser un entero: hola).

Es fácil de leer y entender

El código es comprensible para principiantes:

  • Usa nombres de variables y funciones en español coherentes con el problema (emborrona, lee_argumentos).
  • La estructura con funciones separadas (main, emborrona) facilita seguir la lógica.
  • Los comentarios y la organización del bucle anidado para procesar píxeles son claros.

Sigue buenas prácticas de programación

Presenta errores graves en buenas prácticas:

  • Manejo incorrecto de argumentos: No utiliza sys.argv para procesar entradas por terminal, lo que viola el requisito fundamental del enunciado.
  • Lógica algorítmica defectuosa: Incluir el píxel central en el promedio altera el resultado esperado y no sigue la especificación técnica.
  • Actualización prematura de la imagen: En el bucle de main(), llama a pixels.actualiza() antes de emborrona(), mostrando la imagen antes de aplicar la difusión de la etapa actual (debería hacerse después).

Recomendaciones de mejora

  1. Corrige la lectura de argumentos:

    • Usa sys.argv para obtener imagen y etapas directamente de la terminal.
    • Valida que haya exactamente 2 argumentos antes de procesarlos (ej: if len(sys.argv) != 3).
  2. Ajusta el algoritmo de difusión:

    • No incluyas el píxel central en el promedio. Inicia r_final = 0, g_final = 0, b_final = 0 y contador = 0, sumando solo los vecinos válidos.
  3. Mejora los mensajes de error:

    • En el ValueError, muestra el valor inválido:
      print(f"Número de etapas debe ser un entero: {sys.argv[2]}").
  4. Reordena las operaciones en el bucle:

    • Ejecuta emborrona() antes de pixels.actualiza() para mostrar la imagen después de cada etapa:
      for etapa in range(etapas):
          emborrona()
          pixels.actualiza()
          print(f"Etapa {etapa + 1}")