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

EP03_06 — 🌫️ Filtro de Média com Kernel N×N

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

  1. Dimensões: Ler os inteiros \(L\) (linhas), \(C\) (colunas) e \(N\) (tamanho do kernel, sempre ímpar).
  2. Dados: Ler a matriz de pixels \(f\).
  3. 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\]

  1. Tratamento de Borda: Pixels na borda (onde a janela \(N \times N\) ultrapassa os limites) devem ser copiados diretamente do original sem modificação.
  2. 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
🔲 Simulador EP03_06: Filtro de Média com Kernel N×N g = Média(Vizinhos)

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.

Tamanho do kernel:
Imagem Original f (7×7) Com ruído sal e pimenta
Resultado g (Filtro Suavizado) Passe o mouse para inspecionar
Legenda:
Janela do Kernel
Borda (Copiada)
Pixel Inspecionado
Passe o mouse sobre um pixel interno do resultado para ver o cálculo da média.
Figura 3.31: Simulador EP03_06: Filtro de Média com Kernel N×N
%%writefile EP03_06.cpp
// sua solução
Overwriting EP03_06.cpp
TestSuite("EP03_06.cpp").run()
✔️ EP03_06.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP03_06.cases

🔍 Testando C++: EP03_06.cpp
⚠️ EP03_06.cpp: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.