Skip to content

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

Este es el resultado de una revisión automática de la prácica 03-imagen, 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, invert.py
  • Archivos Python encontrados (excluyendo esos): process.py

Correcto, se elige process.py como entrega.

Comprobación con ficheros de plantilla

Los archivos son diferentes de los de la plantilla.

Comprobación con ficheros de solución

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

Revisión automática de programa

Programa revisado:

import invert
import pixels
import sys


def cambia_brillo(brillo: float):
    for x in range(pixels.ancho):
        for y in range(pixels.alto):
            (r, g, b) = pixels.lee(x, y)

            r = min(255, int(r*brillo)) #se usa min para que si la sol de brillo*225 es mayor que 225, lo reduce hasta este numero
            #max sube el brillo en caso de que sol*225 es menor q 0 y te lo sube
            r = max(0, r)
            g = min(255, int(g * brillo))
            g = max(0, g)
            b = min(255, int(b * brillo))
            b = max(0, b)
            pixels.pinta(x,y,(r,g,b))


    return pixels.pinta(x,y, (r,g,b))

def cambia_desplazamiento(desplazamiento: int):
    for x in range(pixels.ancho):
        for y in range(pixels.alto):
            (r, g, b) = pixels.lee(x, y)

            r = min(255, int(r + desplazamiento))
            r = max(0,r)#se pone esto porque es un numero entero y puede ser negativo
            g = min(255, int(g + desplazamiento))
            g = max(0,g)
            b = min(255, int(b + desplazamiento))
            b = max(0,r)
    return pixels.pinta(x,y, (r,g,b))


def lee_argumentos() -> tuple[str, float, int]:
    if len (sys.argv) != 3:
        imagen = sys.argv[1]
        brillo = float(sys.argv[2])
        desplazamiento = int(sys.argv[3])
    return imagen, brillo, desplazamiento


def main():
    imagen, brillo, desplazamiento = lee_argumentos()
    pixels.prepara(imagen)
    cambia_brillo(brillo)
    cambia_desplazamiento(desplazamiento)
    pixels.espera()


if __name__ == "__main__":
    main()

Análisis

Cumple con el enunciado

  • Parcialmente:
    • La función cambia_brillo multiplica cada componente RGB por el factor de brillo y lo limita entre 0 y 255, pero hay un error en la lógica: el valor debe truncarse o redondearse correctamente (ej. int(r * brillo) puede causar resultados inesperados si el brillo es negativo o muy alto).
    • La función cambia_desplazamiento tiene un error en la línea b = max(0, r) (usa r en lugar de b), lo que distorsiona el canal azul.
    • La función lee_argumentos no valida correctamente el número de argumentos: len(sys.argv) != 3 debería ser len(sys.argv) != 4 (incluye el nombre del script). Esto causa errores si se pasan menos de 3 argumentos.
    • Las funciones incluyen return innecesarios que intentan pintar un único pixel al finalizar, lo cual no es requerido por el enunciado.
    • El programa no maneja errores (ej. archivos GIF inválidos o argumentos incorrectos).

Es fácil de leer y entender

  • Moderadamente:
    • Los nombres de las funciones y variables son claros (ej. cambia_brillo, desplazamiento).
    • Los comentarios explican la lógica de min y max, pero contienen errores (ej. mencionan 225 en lugar de 255).
    • La estructura de los bucles anidados para recorrer la imagen es correcta, pero la lógica de validación de argumentos y los return innecesarios generan confusión.
    • El import innecesario de invert y la falta de manejo de errores dificultan la comprensión.

Sigue buenas prácticas de programación

  • No del todo:
    • No hay manejo de excepciones para casos de error (ej. archivos inexistentes, argumentos no numéricos).
    • La lógica de clamping (min(255, max(0, valor))) se repite en ambas funciones, lo que podría encapsularse en una función auxiliar.
    • El código no sigue PEP8: hay espacios incorrectos (ej. len (sys.argv)), comentarios largos sin formato, y líneas que exceden los 79 caracteres.
    • No se reutiliza el módulo pixels de forma óptima (ej. pixels.pinta se llama dentro de bucles, pero el enunciado no lo prohíbe).

Recomendaciones de mejora

  1. Validar argumentos correctamente:

    • En lee_argumentos, verificar que len(sys.argv) == 4 (script + 3 argumentos). Si no, mostrar un mensaje de error y salir con sys.exit().
    • Ejemplo:
      if len(sys.argv) != 4:
          print("Uso: python3 process.py <imagen> <brillo> <desplazamiento>")
          sys.exit(1)
  2. Eliminar return innecesarios:

    • Quitar las líneas return pixels.pinta(...) en cambia_brillo y cambia_desplazamiento, ya que las funciones deben modificar todos los pixels sin devolver nada.
  3. Corregir el typo en cambia_desplazamiento:

    • Cambiar b = max(0, r) por b = max(0, b) para aplicar correctamente el clamping al canal azul.
  4. Mejorar la clamping de valores:

    • Usar round() en cambia_brillo para evitar truncar decimales (ej. r = round(r * brillo)).
    • Asegurar que cambia_desplazamiento no use int() innecesario, ya que desplazamiento es un entero.
  5. Eliminar importaciones no usadas:

    • Quitar import invert y import sys (solo se usa sys.argv, pero ya está importado).
  6. Revisar comentarios y formato PEP8:

    • Corregir comentarios que mencionan 225 en lugar de 255.
    • Añadir espacios en operadores (ej. len(sys.argv) en lugar de len (sys.argv)).
    • Limitar la longitud de las líneas a 79 caracteres.
  7. Documentar funciones:

    • Agregar docstrings a las funciones para explicar su propósito y parámetros, como se menciona en el enunciado. Ejemplo:
      def cambia_brillo(brillo: float):
          """Modifica la imagen multiplicando cada componente RGB por el factor de brillo."""
          ...