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
- Dimensões: Ler os inteiros \(L\) (linhas) e \(C\) (colunas).
- Imagem original: Ler os \(L \times C\) valores inteiros da matriz
img(intensidades entre 0 e 255). - Fundo estimado: Ler os \(L \times C\) valores inteiros da matriz
bg(intensidades entre 0 e 255, sempre estritamente maiores que zero). - Normalização: Para cada posição \((i,j)\), calcular \[ \text{valor}(i,j)= \frac{\text{img}(i,j)}{\text{bg}(i,j)}\times255. \]
- Arredondamento: Arredondar o resultado para o inteiro mais próximo (round half away from zero, com
np.floor(img + 0.5)). - Saturação: Limitar o valor obtido ao intervalo \([0,255]\).
- Saída: Imprimir a matriz
img_normresultante.
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. |
%%writefile EP06_05.py
# Código PythonWriting 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.