PDI+VC · Exercício de Programação

EP02_03 — 🎨 Quantização de Níveis de Cinza

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\).
🎚️ Simulador EP02_03: Quantização e Profundidade de Bits q = round(p · (L − 1) / 255)

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.

8
Níveis discretos (L = 2ᵇ): 256  |  Valores exibidos: 0 a 255
Original (8 bits → 0…255)
Quantizada (Faixa 0…255)
Bits de saída = 8 → 256 níveis (valores originais preservados)
Figura 2.14: Simulador EP02_03: Quantização e Profundidade de Bits (Redução do Número de Níveis de Cinza)
%%writefile EP02_03.py
# Código Python
Overwriting 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.