Selecione o tamanho do kernel e passe o mouse sobre os pixels do resultado para inspecionar a vizinhança e o cálculo da média aritmética.
3.12.6 EP03_06 🌫️ Filtro de Média com Kernel N×N
Em câmeras de veículos autônomos, imagens capturadas sob chuva ou névoa apresentam ruído gaussiano. O filtro de média é amplamente utilizado para sua redução em tempo real, sendo implementado diretamente no ISP (Image Signal Processor) de sensores CMOS (Complementary Metal-Oxide-Semiconductor).
Os sensores CMOS são os sensores de imagem usados na maioria das câmeras modernas (smartphones, webcams, câmeras automotivas etc.). Eles convertem a luz em sinais elétricos, e o ISP processa esses sinais em tempo real — aplicando operações como redução de ruído, balanço de branco e outros ajustes de imagem.
Ver na Figura 3.31 uma simulação deste EP.
3.12.6.1 📋 Diretrizes de Implementação
- Dimensões: Ler os inteiros \(L\) (linhas), \(C\) (colunas) e \(N\) (tamanho do kernel, sempre ímpar).
- Dados: Ler a matriz de pixels \(f\).
- Filtro de Média: Para cada pixel \((i,j)\) interno (sem bordas), calcular:
\[g(i,j) = \text{round}\left(\frac{1}{N^2} \sum_{s=-(r)}^{r} \sum_{t=-(r)}^{r} f(i+s,\, j+t)\right), \quad r = \lfloor N/2 \rfloor\]
- Tratamento de Borda: Pixels na borda (onde a janela \(N \times N\) ultrapassa os limites) devem ser copiados diretamente do original sem modificação.
- Saída: Exibir a matriz resultante \(L \times C\).
3.12.6.2 📌 Restrições Computacionais
- Raio: \(r = \lfloor N/2 \rfloor\) (metade do kernel, inteiro).
- Pixels internos: \((i,j)\) com \(r \le i < L-r\) e \(r \le j < C-r\).
- Arredondamento: Usar arredondamento matemático antes de converter para inteiro.
- Sem clipping: A média de valores \(\in [0,255]\) permanece em \([0,255]\).
3.12.6.3 🧠 Fundamentação Teórica
| Tamanho \(N\) | Coeficiente | Pixels na janela | Efeito |
|---|---|---|---|
| 3 | \(1/9 \approx 0.111\) | 9 | Suave |
| 5 | \(1/25 = 0.04\) | 25 | Médio |
| 7 | \(1/49 \approx 0.020\) | 49 | Forte |
3.12.6.4 📦 Especificação de Entrada e Saída (VPL)
Entrada:
- Linha 1: Inteiro \(L\).
- Linha 2: Inteiro \(C\).
- Linha 3: Inteiro \(N\) (ímpar, \(N \ge 3\)).
- Linhas seguintes: Elementos da matriz original.
Saída:
- Matriz filtrada \(L \times C\).
3.12.6.5 📌 Exemplos
| Entrada | Saída | Observação |
|---|---|---|
| 3 3 3 10 20 30 40 50 60 70 80 90 |
10 20 30 40 50 60 70 80 90 |
Apenas borda (3×3 = borda total) |
| 5 5 3 0 0 0 0 0 0 0 0 0 0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 |
0 0 0 0 0 0 11 11 11 0 0 11 11 11 0 0 11 11 11 0 0 0 0 0 0 |
Pixel isolado: todos os 9 pixels internos cuja janela 3×3 inclui o valor 100 recebem round(100/9)=11 |
%%writefile EP03_06.py
# Código PythonWriting EP03_06.py
TestSuite("EP03_06.py").run()✔️ EP03_06.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP03_06.cases
🔍 Testando Python: EP03_06.py
⚠️ EP03_06.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.