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'
- Comprobación con ficheros de plantilla
- Comprobación con ficheros de solución
- Revisión automática de programa
- Análisis
- Recomendaciones de mejora
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_brillomultiplica 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_desplazamientotiene un error en la líneab = max(0, r)(usaren lugar deb), lo que distorsiona el canal azul. - La función
lee_argumentosno valida correctamente el número de argumentos:len(sys.argv) != 3debería serlen(sys.argv) != 4(incluye el nombre del script). Esto causa errores si se pasan menos de 3 argumentos. - Las funciones incluyen
returninnecesarios 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).
- La función
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
minymax, pero contienen errores (ej. mencionan225en lugar de255). - La estructura de los bucles anidados para recorrer la imagen es correcta, pero la lógica de validación de argumentos y los
returninnecesarios generan confusión. - El import innecesario de
inverty la falta de manejo de errores dificultan la comprensión.
- Los nombres de las funciones y variables son claros (ej.
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
pixelsde forma óptima (ej.pixels.pintase llama dentro de bucles, pero el enunciado no lo prohíbe).
Recomendaciones de mejora
-
Validar argumentos correctamente:
- En
lee_argumentos, verificar quelen(sys.argv) == 4(script + 3 argumentos). Si no, mostrar un mensaje de error y salir consys.exit(). - Ejemplo:
if len(sys.argv) != 4: print("Uso: python3 process.py <imagen> <brillo> <desplazamiento>") sys.exit(1)
- En
-
Eliminar
returninnecesarios:- Quitar las líneas
return pixels.pinta(...)encambia_brilloycambia_desplazamiento, ya que las funciones deben modificar todos los pixels sin devolver nada.
- Quitar las líneas
-
Corregir el typo en
cambia_desplazamiento:- Cambiar
b = max(0, r)porb = max(0, b)para aplicar correctamente el clamping al canal azul.
- Cambiar
-
Mejorar la clamping de valores:
- Usar
round()encambia_brillopara evitar truncar decimales (ej.r = round(r * brillo)). - Asegurar que
cambia_desplazamientono useint()innecesario, ya quedesplazamientoes un entero.
- Usar
-
Eliminar importaciones no usadas:
- Quitar
import invertyimport sys(solo se usasys.argv, pero ya está importado).
- Quitar
-
Revisar comentarios y formato PEP8:
- Corregir comentarios que mencionan
225en lugar de255. - Añadir espacios en operadores (ej.
len(sys.argv)en lugar delen (sys.argv)). - Limitar la longitud de las líneas a 79 caracteres.
- Corregir comentarios que mencionan
-
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.""" ...
- Agregar docstrings a las funciones para explicar su propósito y parámetros, como se menciona en el enunciado. Ejemplo: