PDI+VC · Ejercicio de Programación

EP03_06 — 🌫️ Filtro de Media con Kernel N×N

3.12.6 EP03_06 🌫️ Filtro de Media con Kernel N×N

En cámaras de vehículos autónomos, las imágenes capturadas bajo lluvia o niebla presentan ruido gaussiano. El filtro de media se utiliza ampliamente para su reducción en tiempo real, implementándose directamente en el ISP (Image Signal Processor) de los sensores CMOS (Complementary Metal-Oxide-Semiconductor).

Los sensores CMOS son los sensores de imagen utilizados en la mayoría de las cámaras modernas (smartphones, webcams, cámaras automotrices, etc.). Convierten la luz en señales eléctricas, y el ISP procesa estas señales en tiempo real — aplicando operaciones como reducción de ruido, balance de blancos y otros ajustes de imagen.

Ver en la Figura 3.31 una simulación de este EP.

3.12.6.1 📋 Directrices de Implementación

  1. Dimensiones: Leer los enteros \(L\) (filas), \(C\) (columnas) y \(N\) (tamaño del kernel, siempre impar).
  2. Datos: Leer la matriz de píxeles \(f\).
  3. Filtro de Media: Para cada píxel \((i,j)\) interno (sin bordes), 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. Tratamiento de Bordes: Los píxeles en el borde (donde la ventana \(N \times N\) sobrepasa los límites) deben copiarse directamente del original sin modificación.
  2. Salida: Mostrar la matriz resultante \(L \times C\).

3.12.6.2 📌 Restricciones Computacionales

  • Radio: \(r = \lfloor N/2 \rfloor\) (mitad del kernel, entero).
  • Píxeles internos: \((i,j)\) con \(r \le i < L-r\) y \(r \le j < C-r\).
  • Redondeo: Usar redondeo matemático antes de convertir a entero.
  • Sin clipping: El promedio de valores \(\in [0,255]\) permanece en \([0,255]\).

3.12.6.3 🧠 Fundamentación Teórica

Tamaño \(N\) Coeficiente Píxeles en la ventana Efecto
3 \(1/9 \approx 0.111\) 9 Suave
5 \(1/25 = 0.04\) 25 Medio
7 \(1/49 \approx 0.020\) 49 Fuerte

3.12.6.4 📦 Especificación de Entrada y Salida (VPL)

Entrada:

  • Línea 1: Entero \(L\).
  • Línea 2: Entero \(C\).
  • Línea 3: Entero \(N\) (impar, \(N \ge 3\)).
  • Líneas siguientes: Elementos de la matriz original.

Salida:

  • Matriz filtrada \(L \times C\).

3.12.6.5 📌 Ejemplos

Entrada Salida Observación
3
3
3
10 20 30
40 50 60
70 80 90
10 20 30
40 50 60
70 80 90
Solo borde (3×3 = borde 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
Píxel aislado: todos los 9 píxeles internos cuya ventana 3×3 incluye el valor 100 reciben round(100/9)=11
🔲 Simulador EP03_06: Filtro de Media con Kernel N×N g = Media(Vecinos)

Seleccione el tamaño del kernel y pase el mouse sobre los píxeles del resultado para inspeccionar la vecindad y el cálculo de la media aritmética.

Tamaño del kernel:
Imagen Original f (7×7) Con ruido sal y pimienta
Resultado g (Filtro Suavizado) Pase el mouse para inspeccionar
Leyenda:
Ventana del Kernel
Borde (Copiado)
Píxel Inspeccionado
Pase el mouse sobre un píxel interno del resultado para ver el cálculo de la media.
Figura 3.31: Simulador EP03_06: Filtro de Media con Kernel N×N
%%writefile EP03_06.py
# Código Python
Overwriting EP03_06.py
TestSuite("EP03_06.py").run()
✔️ EP03_06.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP03_06.cases

🔍 Probando Python: EP03_06.py
⚠️ EP03_06.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.