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.
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\). |
%%writefile EP02_03.cpp
// your solutionOverwriting EP02_03.cpp
TestSuite("EP02_03.cpp").run()✔️ EP02_03.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP02_03.cases
🔍 Probando C++: EP02_03.cpp
⚠️ EP02_03.cpp: archivo vacío (menos de 3 líneas). Pruebas omitidas.