PDI+VC · Ejercicio de Programación

EP06_05 — 🟠 Normalización de Fondo por División (Corrección de Iluminación)

6.14.5 EP06_05 🟠 Normalización de Fondo por División (Corrección de Iluminación)

Un formulario fue fotografiado bajo iluminación no uniforme, lo que hace que un lado de la hoja aparezca más claro que el otro. En estas condiciones, la umbralización global por Otsu puede producir resultados insatisfactorios, ya que un único umbral no separa adecuadamente el texto y el fondo en toda la imagen. La solución presentada en el capítulo consiste en normalizar el fondo, dividiendo la imagen original por una versión fuertemente suavizada de sí misma, que representa la iluminación de baja frecuencia.

En este ejercicio, la imagen original y el fondo suavizado (equivalente al resultado de un cv2.GaussianBlur con \(\sigma\) elevado) ya son proporcionados. Su tarea es implementar la etapa de normalización que produce la imagen corregida.

6.14.5.1 📋 Directrices de Implementación

  1. Dimensiones: Leer los enteros \(L\) (filas) y \(C\) (columnas).
  2. Imagen original: Leer los \(L \times C\) valores enteros de la matriz img (intensidades entre 0 y 255).
  3. Fondo estimado: Leer los \(L \times C\) valores enteros de la matriz bg (intensidades entre 0 y 255, siempre estrictamente mayores que cero).
  4. Normalización: Para cada posición \((i,j)\), calcular \[ \text{valor}(i,j)= \frac{\text{img}(i,j)}{\text{bg}(i,j)}\times255. \]
  5. Redondeo: Redondear el resultado al entero más cercano (round half away from zero, con np.floor(img + 0.5)).
  6. Saturación: Limitar el valor obtenido al intervalo \([0,255]\).
  7. Salida: Imprimir la matriz img_norm resultante.

6.14.5.2 📌 Restricciones Computacionales

  • División por cero: la entrada garantiza \(\text{bg}(i,j)>0\) en todas las posiciones.
  • Orden de las operaciones: primero redondear, luego aplicar la saturación.
  • Procesamiento independiente: cada píxel debe normalizarse individualmente, sin utilizar información de los píxeles vecinos.

6.14.5.3 🧠 Fundamentación Teórica

Situación Efecto de la normalización
\(\text{img}(i,j)=\text{bg}(i,j)\) Resultado igual a \(255\), correspondiente al fondo normalizado.
\(\text{img}(i,j)<\text{bg}(i,j)\) Resultado menor que \(255\), preservando regiones más oscuras, como el texto.
\(\text{img}(i,j)>\text{bg}(i,j)\) Resultado superior a \(255\), posteriormente saturado.
Fondo con iluminación no uniforme La división reduce las variaciones lentas de iluminación, haciendo la imagen más homogénea.

La división por el fondo estimado reduce los efectos de la iluminación no uniforme y preserva el contraste entre el primer plano y el fondo, facilitando las etapas posteriores de segmentación.

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

Entrada:

  • Línea 1: Entero \(L\).
  • Línea 2: Entero \(C\).
  • Siguientes \(L\) líneas: elementos de la matriz img.
  • Siguientes \(L\) líneas: elementos de la matriz bg.

Salida:

  • Matriz img_norm, con \(L\) filas y \(C\) columnas, conteniendo valores enteros separados por espacios.

6.14.5.5 📌 Ejemplos

Entrada Salida Observación
2
2
60 120
180 40
100 100
200 80
153 255
230 128
Los valores superiores a \(255\) deben saturarse; \(180/200\times255=229{,}5\) resulta en \(230\) después del redondeo.
1
3
30 60 90
60 60 60
128 255 255 Solo el primer valor permanece por debajo de \(255\) después de la normalización.
🎮 Simulador EP06_05: Normalización de Fondo por División (img / bg) × 255
Ajusta el gradiente de fondo (izquierda → derecha) y observa cómo la división cancela la variación de iluminación.
img (Original)
bg (Fondo Suavizado)
img_norm (Salida)
–
Figura 6.25: Simulador EP06_05: Normalización de Fondo por División
%%writefile EP06_05.py
# Código Python
Overwriting EP06_05.py
TestSuite("EP06_05.py").run()
✔️ EP06_05.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP06_05.cases

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