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
- Dimensiones: Leer los enteros \(L\) (filas) y \(C\) (columnas).
- Imagen original: Leer los \(L \times C\) valores enteros de la matriz
img(intensidades entre 0 y 255). - Fondo estimado: Leer los \(L \times C\) valores enteros de la matriz
bg(intensidades entre 0 y 255, siempre estrictamente mayores que cero). - Normalización: Para cada posición \((i,j)\), calcular \[ \text{valor}(i,j)= \frac{\text{img}(i,j)}{\text{bg}(i,j)}\times255. \]
- Redondeo: Redondear el resultado al entero más cercano (round half away from zero, con
np.floor(img + 0.5)). - Saturación: Limitar el valor obtenido al intervalo \([0,255]\).
- Salida: Imprimir la matriz
img_normresultante.
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. |
%%writefile EP06_05.py
# Código PythonOverwriting 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.