Trabajo Práctico 2 — Diseñador gráfico de videojuegos#
Introducción#
En el desarrollo de videojuegos, una decisión clave del diseño gráfico es el shader que se utilizará para dibujar objetos en pantalla. Un shader es un programa que corre en la GPU y determina cómo se deben pintar los píxeles de un objeto según su posición, color, textura, iluminación, etc. Existen diversos tipos de shaders, cada uno con sus propias características y efectos visuales.
La dirección artística del estudio busca explorar dos técnicas de transformación de imagen que podrían inspirar shaders con estética marcada: el filtro Vitral (Voronoi) y el filtro Mosaico Cuadriculado. El objetivo es implementar ambos métodos, compararlos visualmente y evaluar su impacto estético.
Imágenes#
Las imágenes se representan como matrices de píxeles. En una imagen en escala de grises, esta matriz tiene dos dimensiones (ancho y alto) con valores entre 0 y 255, donde 0 representa el negro y 255 el blanco. En el caso de imágenes a color, se utilizan tres matrices correspondientes a los canales rojo, verde y azul (RGB), cada uno con valores en el mismo rango. La combinación de estos tres canales define el color final de cada píxel.
Para trabajar con imágenes en este proyecto se puede utilizar la función Image.open de la librería Pillow en conjunto con NumPy. Uno de los objetivos es profundizar en el manejo de estas herramientas.
Edición de Imágenes#
Cuando se edita una imagen, se modifican los valores de sus matrices de píxeles para conseguir el efecto deseado. Por ejemplo, se puede oscurecer la imagen disminuyendo los valores de la matriz o se puede modificar su tonalidad alterando los valores de un canal específico.
Filtro Vitral (Voronoi)#
El filtro vitral modifica los píxeles de manera tal que la imagen resultante parece hecha de piezas de vidrio coloreadas. La idea es dividir la imagen en n partes y pintar cada parte con el color promedio de los píxeles en esa zona.
Pasos para implementar este filtro:
- Elegir
npuntos aleatorios sobre la imagen (coordenadas(y, x)). -
Para cada píxel
(y, x)de la imagen, hallar el punto más cercano según una métrica de distancia:Métricas de distancia
-
Euclidiana:
\[ d_\text{eucl}((x_{pixel}, y_{pixel}), (x_{punto}, y_{punto})) = (y_{pixel} - y_{punto})^2 + (x_{pixel} - x_{punto})^2 \] -
Manhattan:
\[ d_\text{man}((x_{pixel}, y_{pixel}), (x_{punto}, y_{punto})) = |y_{pixel} - y_{punto}| + |x_{pixel} - x_{punto}| \]
-
-
Asignarle a cada píxel el índice del punto más cercano. Todos los píxeles con mismo índice asignado forman una misma celda.
- Para cada celda, calcular el color promedio RGB de los píxeles originales y usarlo para colorear toda la celda.
- Mostrar y guardar la imagen resultante.
Filtro Mosaico Cuadriculado (subdivisión adaptativa)#
El filtro mosaico produce un efecto de bloques (tipo pixel art) mediante subdivisión adaptativa: comienza con un bloque que cubre toda la imagen y lo divide en cuatro cuando su varianza de color es alta; repite el proceso hasta que los bloques sean suficientemente uniformes o pequeños.
Pasos para implementar esta técnica:
- Iniciar con un único bloque que cubra toda la imagen.
- Para cada bloque, calcular la varianza media RGB de sus píxeles.
- Si la varianza supera un umbral (
variance_threshold) y el bloque no es demasiado pequeño (min_size), dividirlo en cuatro cuadrantes (NW, NE, SW, SE). - Repetir el proceso por un máximo de
max_passeso hasta que no haya más divisiones que hacer. - Rellenar cada bloque final con el color promedio de sus píxeles.
- (Opcional) Dibujar bordes negros en el perímetro de cada bloque para resaltar la cuadrícula.
Elección de hiperparámetros
variance_thresholdcontrola cuánto detalle preserva el mosaico (mayor → más subdivisiones).min_sizeevita bloques demasiado pequeños (costos computacionales y ruido visual).max_passeslimita el número de iteraciones de subdivisión.
Requerimientos del Programa#
Se te pide escribir un script en Python que:
-
Solicite al usuario:
- La ruta de la imagen a procesar.
- El método a aplicar: vitral o mosaico.
- En caso de elegir vitral:
- La cantidad de puntos
n. Si no especifica, usar por defecto1000. - La métrica de distancia:
"euclidean"o"manhattan". Si no especifica, usar"euclidean".
- La cantidad de puntos
- En caso de elegir mosaico:
- El umbral de varianza
variance_threshold. Si no especifica, usar150.0. - El tamaño mínimo de bloque
min_size. Si no especifica, usar20. - El número máximo de subdivisiones
max_passes. Si no especifica, usar10. - Si desea dibujar bordes en los bloques (
True/False). Por defecto,True.
- El umbral de varianza
-
Procese la imagen:
- Si el método es vitral, aplicar el algoritmo de celdas de Voronoi y colorear cada celda con el promedio RGB.
- Si el método es mosaico, aplicar la subdivisión adaptativa y rellenar cada bloque con su color promedio (y bordes opcionales).
-
Genere y muestre:
- La imagen original y la imagen resultante, una al lado de la otra.
- Guardar las imágenes procesadas en una carpeta
out/.
Ejemplos de ejecución del programa
Ingrese la ruta de la imagen: img/sunrise.bmp
Seleccione el método (vitral/mosaico): mosaico
Ingrese el umbral de varianza (default=150): 300
Ingrese el tamaño mínimo de bloque (default=20): 25
Ingrese el número máximo de subdivisiones (default=10): 12
¿Dibujar bordes en los bloques? (si/no): si
Seleccione la ruta para guardar la imagen procesada: out/sunrise_mosaic.png
Imágenes de prueba#
Se pueden descargar imágenes de prueba de esta carpeta.
Entrega#
El trabajo se realizará en grupos de hasta dos estudiantes. El desarrollo del trabajo se llevará a cabo en un repositorio privado de Github, el cual debe ser compartido con los docentes de la materia (se pueden encontrar los usuarios de los docentes aquí). La entrega del trabajo se realizará subiendo el link del repositorio a la tarea correspondiente en el campus del curso. La fecha de entrega se encuentra en la misma tarea y en el calendario del curso.
Importante: Se recuerda a los estudiantes que las entregas deben ser un producto original de cada grupo, por lo que se les pide revisar la sección 6 del programa de la materia y el Código de Honor y Ética. En caso de sospecha de copia, se citará a los grupos involucrados para una defensa oral para verificar la autoría de la entrega. En caso de no poder defender la autoría, los profesores estarán obligados a elevar el caso al comité de ética de la universidad.








