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:
#!/usr/bin/env python3
import sys
import pixels
def lee_argumentos() -> tuple[str, float, int]:
"""Lee los argumentos de la línea de comandos y los valida."""
if len(sys.argv) != 4:
sys.exit("Uso: python3 process.py <imagen.gif> <factor_brillo> <desplazamiento>")
imagen = sys.argv[1]
try:
brillo = float(sys.argv[2])
except ValueError:
sys.exit("Error: El factor de brillo debe ser un número real (float).")
try:
desplazamiento = int(sys.argv[3])
except ValueError:
sys.exit("Error: El desplazamiento debe ser un número entero (int).")
return imagen, brillo, desplazamiento
def cambia_brillo(brillo: float):
"""
Cambia el brillo de la imagen multiplicando cada componente RGB
por el valor 'brillo'. Los valores mayores de 255 se limitan a 255.
"""
ancho, alto = pixels.tam_lienzo()
for x in range(ancho):
for y in range(alto):
r, g, b = pixels.lee(x, y)
# Multiplicamos cada componente por el factor de brillo
r = min(int(r * brillo), 255)
g = min(int(g * brillo), 255)
b = min(int(b * brillo), 255)
pixels.pinta(x, y, (r, g, b))
def cambia_desplazamiento(desplazamiento: int):
"""
Desplaza los colores sumando 'desplazamiento' a cada componente RGB.
Los valores fuera del rango [0, 255] se recortan.
"""
ancho, alto = pixels.tam_lienzo()
for x in range(ancho):
for y in range(alto):
r, g, b = pixels.lee(x, y)
# Sumamos el desplazamiento y recortamos al rango [0, 255]
r = max(0, min(r + desplazamiento, 255))
g = max(0, min(g + desplazamiento, 255))
b = max(0, min(b + desplazamiento, 255))
pixels.pinta(x, y, (r, g, b))
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
El programa cumple con todos los requisitos especificados:
- Lee correctamente los tres argumentos de la línea de comandos (imagen, brillo y desplazamiento)
- Aplica el cambio de brillo multiplicando cada componente RGB por el factor y limitando a 255
- Aplica el desplazamiento sumando el mismo valor entero a cada componente RGB y recortando al rango [0,255]
- Tiene la función
lee_argumentos()con la signatura especificada - Incluye la estructura
main()con el código exacto requerido - Utiliza el módulo
pixels.pytal como se menciona en el enunciado
Es fácil de leer y entender
El código es accesible para estudiantes principiantes gracias a:
- Comentarios claros que explican cada paso del proceso
- Nombres de variables y funciones descriptivos en español
- Estructura modular con funciones bien definidas
- Uso consistente de sangrías y espaciado adecuado
- Manejo de errores con mensajes explicativos
Sigue buenas prácticas de programación
El programa muestra buenas prácticas como:
- Validación de argumentos con mensajes de error específicos
- Uso de try/except para manejar conversiones inválidas
- Separación de responsabilidades en funciones distintas
- Documentación con docstrings en cada función
- Uso de funciones del módulo
pixelsde forma correcta
Recomendaciones de mejora
-
Manejo de truncamiento en el brillo: Al convertir a entero con
int()se pierde la precisión decimal. Considerar usarround()para un cálculo más preciso:
r = min(round(r * brillo), 255)
-
Validación adicional de parámetros: Aunque el enunciado no lo especifica, podría añadirse una validación para asegurar que el factor de brillo sea positivo (aunque técnicamente el enunciado permite cualquier valor float).
-
Optimización de código repetido: Las funciones
cambia_brilloycambia_desplazamientotienen estructuras muy similares. Para evitar repetición, se podría crear una función auxiliar que itere por todos los píxeles y aplique una transformación específica a cada componente. -
Comprobación de formato de imagen: Aunque el enunciado asume que la imagen es GIF, podría añadirse una validación básica para confirmar que el archivo tiene extensión .gif.
-
Uso de constantes para límites: Definir
MAX_COLOR = 255yMIN_COLOR = 0mejoraría la legibilidad y facilitaría futuros cambios:
MAX_COLOR = 255
MIN_COLOR = 0
-
Mensajes de error más específicos: En lugar de salir con mensajes genéricos, se podrían incluir ejemplos de uso correcto para ayudar al usuario a entender el formato esperado.
-
Comprobación de rango para desplazamiento: Aunque el enunciado permite cualquier entero, podría añadirse una nota en los comentarios explicando que el desplazamiento puede afectar negativamente a la calidad de la imagen si es muy grande.