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): imagen.py
Correcto, se elige imagen.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 sys
import pixels
def lee_argumentos() -> tuple[str, float, int]:
if len(sys.argv) != 4:
print("Uso: python3 process.py <imagen.gif> <brillo:float> <desplazamiento:int>")
sys.exit(1)
imagen = sys.argv[1]
try:
brillo = float(sys.argv[2])
except ValueError:
print("Error: el brillo debe ser un número real (float).")
sys.exit(1)
try:
desplazamiento = int(sys.argv[3])
except ValueError:
print("Error: el desplazamiento debe ser un número entero (int).")
sys.exit(1)
return imagen, brillo, desplazamiento
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(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):
for x in range(pixels.ancho):
for y in range(pixels.alto):
r, g, b = pixels.lee(x, y)
r = min(max(r + desplazamiento, 0), 255)
g = min(max(g + desplazamiento, 0), 255)
b = min(max(b + desplazamiento, 0), 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 en el enunciado:
- La función
lee_argumentos()valida correctamente el número de argumentos y sus tipos (float e int), mostrando mensajes de error descriptivos. -
cambia_brillo()multiplica cada componente RGB por el factor de brillo y lo limita a 255 usandomin(). -
cambia_desplazamiento()ajusta cada componente RGB sumando el desplazamiento y lo limita entre 0 y 255 conmin(max(...)). - La estructura de
main()coincide exactamente con la requerida, incluyendo el orden de aplicar brillo y desplazamiento.
Es fácil de leer y entender
El código es claro para un principiante:
- Nombres de funciones y variables descriptivos (ej:
cambia_brillo,desplazamiento). - Uso de bucles
foranidados conrange(pixels.ancho)yrange(pixels.alto)para procesar cada pixel. - La lógica de ajuste de valores RGB está bien explicada con
min()ymax(). - La estructura general sigue el flujo esperado: leer argumentos → preparar imagen → aplicar efectos → esperar.
Sigue buenas prácticas de programación
- Validación de entradas: Detecta errores en los argumentos y termina con mensajes claros.
- Separación de responsabilidades: Cada función tiene una única tarea bien definida.
- Uso correcto de tipos: Las anotaciones de tipos (
str,float,int) y el retorno detupleenlee_argumentos()son adecuados. - Manejo de excepciones: Captura errores de conversión de tipos con
try/except.
Recomendaciones de mejora
-
Claridad en el cálculo de brillo:
Encambia_brillo(), el truncamiento implícito al convertir aintpodría causar confusión. Por ejemplo,r * brillo = 254.9se convierte en254, pero quizás se espera redondeo. Se podría usarround(r * brillo)para mayor precisión, aunque el enunciado no lo exige explícitamente. -
Evitar repetición en funciones de procesamiento:
Ambas funciones (cambia_brilloycambia_desplazamiento) repiten la estructura de bucles anidados. Si bien el enunciado no lo pide, se podría crear una función auxiliar para iterar por todos los pixels, pasando una función de transformación como parámetro. Esto no es obligatorio, pero mejora la reutilización. -
Documentación de funciones:
Añadir comentarios o docstrings a las funcionescambia_brillo()ycambia_desplazamiento()para explicar su propósito y cómo afectan a los componentes RGB. Ejemplo:def cambia_brillo(brillo: float): """Ajusta el brillo de cada pixel multiplicando sus componentes RGB por 'brillo'.""" -
Manejo de valores negativos en brillo:
Aunque el enunciado no lo menciona, si el factor de brillo es negativo, el código actual podría generar valores RGB negativos. Aunquecambia_brillo()no está obligado a manejarlo, quizás se debería validar enlee_argumentos()quebrillo >= 0, ya que un brillo negativo no tiene sentido en este contexto.