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

EP06_05 — 🟠 Normalização de Fundo por Divisão (Correção de Iluminação)

6.14.5 EP06_05 🟠 Normalização de Fundo por Divisão (Correção de Iluminação)

Um formulário foi fotografado sob iluminação não uniforme, fazendo com que um lado da folha apareça mais claro que o outro. Nessas condições, a limiarização global por Otsu pode produzir resultados insatisfatórios, pois um único limiar não separa adequadamente texto e fundo em toda a imagem. A solução apresentada no capítulo consiste em normalizar o fundo, dividindo a imagem original por uma versão fortemente suavizada de si mesma, que representa a iluminação de baixa frequência.

Neste exercício, a imagem original e o fundo suavizado (equivalente ao resultado de um cv2.GaussianBlur com \(\sigma\) elevado) já são fornecidos. Sua tarefa é implementar a etapa de normalização que produz a imagem corrigida.

6.14.5.1 📋 Diretrizes de Implementação

  1. Dimensões: Ler os inteiros \(L\) (linhas) e \(C\) (colunas).
  2. Imagem original: Ler os \(L \times C\) valores inteiros da matriz img (intensidades entre 0 e 255).
  3. Fundo estimado: Ler os \(L \times C\) valores inteiros da matriz bg (intensidades entre 0 e 255, sempre estritamente maiores que zero).
  4. Normalização: Para cada posição \((i,j)\), calcular \[ \text{valor}(i,j)= \frac{\text{img}(i,j)}{\text{bg}(i,j)}\times255. \]
  5. Arredondamento: Arredondar o resultado para o inteiro mais próximo (round half away from zero, com np.floor(img + 0.5)).
  6. Saturação: Limitar o valor obtido ao intervalo \([0,255]\).
  7. Saída: Imprimir a matriz img_norm resultante.

6.14.5.2 📌 Restrições Computacionais

  • Divisão por zero: a entrada garante \(\text{bg}(i,j)>0\) em todas as posições.
  • Ordem das operações: primeiro arredondar, depois aplicar a saturação.
  • Processamento independente: cada pixel deve ser normalizado individualmente, sem utilizar informações dos pixels vizinhos.

6.14.5.3 🧠 Fundamentação Teórica

Situação Efeito da normalização
\(\text{img}(i,j)=\text{bg}(i,j)\) Resultado igual a \(255\), correspondente ao fundo normalizado.
\(\text{img}(i,j)<\text{bg}(i,j)\) Resultado menor que \(255\), preservando regiões mais escuras, como texto.
\(\text{img}(i,j)>\text{bg}(i,j)\) Resultado superior a \(255\), posteriormente saturado.
Fundo com iluminação não uniforme A divisão reduz as variações lentas de iluminação, tornando a imagem mais homogênea.

A divisão pelo fundo estimado reduz os efeitos da iluminação não uniforme e preserva o contraste entre o primeiro plano e o fundo, facilitando as etapas posteriores de segmentação.

6.14.5.4 📦 Especificação de Entrada e Saída (VPL)

Entrada:

  • Linha 1: Inteiro \(L\).
  • Linha 2: Inteiro \(C\).
  • Próximas \(L\) linhas: elementos da matriz img.
  • Próximas \(L\) linhas: elementos da matriz bg.

Saída:

  • Matriz img_norm, com \(L\) linhas e \(C\) colunas, contendo valores inteiros separados por espaço.

6.14.5.5 📌 Exemplos

Entrada Saída Observação
2
2
60 120
180 40
100 100
200 80
153 255
230 128
Valores superiores a \(255\) devem ser saturados; \(180/200\times255=229{,}5\) resulta em \(230\) após o arredondamento.
1
3
30 60 90
60 60 60
128 255 255 Apenas o primeiro valor permanece abaixo de \(255\) após a normalização.
🎮 Simulador EP06_05: Normalização de Fundo por Divisão (img / bg) × 255
Ajuste o gradiente de fundo (esquerda → direita) e observe como a divisão cancela a variação de iluminação.
img (Original)
bg (Fundo Suavizado)
img_norm (Saída)
–
Figura 6.25: Simulador EP06_05: Normalização de Fundo por Divisão
%%writefile EP06_05.py
# Código Python
Writing EP06_05.py
TestSuite("EP06_05.py").run()
✔️ EP06_05.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP06_05.cases

🔍 Testando Python: EP06_05.py
⚠️ EP06_05.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.