Ajuste o número de bits de saída (b) para observar o mapeamento dos 256 níveis contínuos de cinza para L = 2ᵇ níveis discretos de quantização.
2.12.3 EP02_03 🎨 Quantização de Níveis de Cinza
Nesta atividade, você deve implementar a quantização uniforme de uma imagem, reduzindo a quantidade de níveis de intensidade de cinza originais para uma nova escala baseada em um número menor de bits.
- Leia dois inteiros L e C, representando as dimensões da matriz.
- Leia um inteiro \(k\) (\(1 \le k \le 8\)), representando o novo número de bits da imagem.
- Calcule o número de níveis (\(N = 2^k\)) e o tamanho do intervalo (passo).
- Para cada pixel \(p\), calcule o novo valor \(p'\) mapeando-o para o índice do nível discretizado correspondente (variando de \(0\) a \(2^k-1\)).
- Imprima a matriz resultante com os mesmos valores de dimensões originais.
- Ver na Figura 2.14 uma simulação deste EP.
📌 Importante:
- Posterização: Ao reduzir drasticamente os níveis (ex: \(k=2\)), você notará que degradês suaves se transformam em faixas abruptas de cor devido à perda de resolução de amplitude.
- Cálculo do Passo: O intervalo entre cada nível é definido por \(passo = 256 / 2^k\).
- Mapeamento: O método de quantização uniforme por truncamento que mapeia o pixel para o índice do seu respectivo nível discretizado é dado por:
\[p' = \left\lfloor \frac{p}{passo} \right\rfloor\]
Em termos de implementação (como em Python), isso equivale à divisão inteira: p' = p // passo.
2.12.3.1 🧠 Discretização da Amplitude
Enquanto a subamostragem lida com a resolução espacial, a quantização foca na precisão da cor (amplitude). Reduzir os bits significa simplificar a informação cromática:
| Parâmetro | Função | Efeito |
|---|---|---|
| Bits (\(k\)) | Profundidade de cor | Define quantos tons diferentes a imagem pode ter (\(2^k\)). |
| Passo | Intervalo de tom | Espaçamento entre os níveis de cinza permitidos. |
| Posterização | Fenômeno visual | Transformação de variações contínuas em blocos de cor sólida. |
2.12.3.2 📋 Tarefa (especificação para VPL)
Entrada:
A primeira linha contém L.
A segunda linha contém C.
A terceira linha contém o número de bits k.
As linhas seguintes contêm os elementos da matriz \(L \times C\).
Saída:
A matriz transformada com os índices dos níveis quantizados, mantendo o tamanho original \(L \times C\).
2.12.3.3 📌 Exemplos
| Entrada | Saída | Observação |
|---|---|---|
| 1 4 2 0 80 170 255 |
0 1 2 3 | Com \(k=2\), temos \(2^2=4\) níveis discretos disponíveis (\(0,1,2,3\)). O passo é \(256/4=64\). Aplicando a divisão inteira 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 | Com \(k=1\), temos \(2^1=2\) níveis (\(0\) e \(1\)). Passo \(=256/2=128\). Pixels menores que \(128\) resultam em \(0\), e pixels maiores ou iguais a \(128\) resultam em \(1\). |
%%writefile EP02_03.py
# Código PythonOverwriting EP02_03.py
TestSuite("EP02_03.py").run()✔️ EP02_03.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP02_03.cases
🔍 Testando Python: EP02_03.py
⚠️ EP02_03.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.