PDI+VC · Ejercicio de Programación

EP02_03 — 🎨 Cuantización de Niveles de Gris

2.12.3 EP02_03 🎨 Cuantización de Niveles de Gris

En esta actividad, debes implementar la cuantización uniforme de una imagen, reduciendo la cantidad de niveles de intensidad de gris originales a una nueva escala basada en un número menor de bits.

  • Lee dos enteros L y C, que representan las dimensiones de la matriz.
  • Lee un entero \(k\) (\(1 \le k \le 8\)), que representa el nuevo número de bits de la imagen.
  • Calcula el número de niveles (\(N = 2^k\)) y el tamaño del intervalo (paso).
  • Para cada píxel \(p\), calcula el nuevo valor \(p'\) mapeándolo al índice del nivel discretizado correspondiente (que varía de \(0\) a \(2^k-1\)).
  • Imprime la matriz resultante con los mismos valores de dimensiones originales.
  • Consulta en Figura 2.14 una simulación de este EP.

📌 Importante:

  • Posterización: Al reducir drásticamente los niveles (ej: \(k=2\)), notarás que los degradados suaves se transforman en bandas abruptas de color debido a la pérdida de resolución de amplitud.
  • Cálculo del Paso: El intervalo entre cada nivel se define como \(paso = 256 / 2^k\).
  • Mapeo: El método de cuantización uniforme por truncamiento que mapea el píxel al índice de su respectivo nivel discretizado está dado por:

\[p' = \left\lfloor \frac{p}{paso} \right\rfloor\]

En términos de implementación (como en Python), esto equivale a la división entera: p' = p // paso.

2.12.3.1 🧠 Discretización de la Amplitud

Mientras que el submuestreo trata con la resolución espacial, la cuantización se centra en la precisión del color (amplitud). Reducir los bits significa simplificar la información cromática:

Parámetro Función Efecto
Bits (\(k\)) Profundidad de color Define cuántos tonos diferentes puede tener la imagen (\(2^k\)).
Paso Intervalo de tono Espaciado entre los niveles de gris permitidos.
Posterización Fenómeno visual Transformación de variaciones continuas en bloques de color sólido.

2.12.3.2 📋 Tarea (especificación para VPL)

Entrada:

La primera línea contiene L.

La segunda línea contiene C.

La tercera línea contiene el número de bits k.

Las líneas siguientes contienen los elementos de la matriz \(L \times C\).

Salida:

La matriz transformada con los índices de los niveles cuantizados, manteniendo el tamaño original \(L \times C\).

2.12.3.3 📌 Ejemplos

Entrada Salida Observación
1
4
2
0 80 170 255
0 1 2 3 Con \(k=2\), tenemos \(2^2=4\) niveles discretos disponibles (\(0,1,2,3\)). El paso es \(256/4=64\). Aplicando la división entera por elemento: \(0 // 64 = 0\), \(80 // 64 = 1\), \(170 // 64 = 2\), \(255 // 64 = 3\).
1
5
1
10 50 120 200 250
0 0 0 1 1 Con \(k=1\), tenemos \(2^1=2\) niveles (\(0\) y \(1\)). Paso \(=256/2=128\). Los píxeles menores que \(128\) resultan en \(0\), y los píxeles mayores o iguales a \(128\) resultan en \(1\).
🎚️ Simulador EP02_03: Cuantización y Profundidad de Bits q = round(p · (L − 1) / 255)

Ajusta el número de bits de salida (b) para observar el mapeo de los 256 niveles continuos de gris a L = 2ᵇ niveles discretos de cuantización.

8
Niveles discretos (L = 2ᵇ): 256  |  Valores mostrados: 0 a 255
Original (8 bits → 0…255)
Cuantizada (Rango 0…255)
Bits de salida = 8 → 256 niveles (valores originales preservados)
Figura 2.14: Simulador EP02_03: Cuantización y Profundidad de Bits (Reducción del Número de Niveles de Gris)
%%writefile EP02_03.py
# Código Python
Overwriting EP02_03.py
TestSuite("EP02_03.py").run()
✔️ EP02_03.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP02_03.cases

🔍 Probando Python: EP02_03.py
⚠️ EP02_03.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.