PDI+VC · Ejercicio de Programación

EP08_09 — 🟠 Gradiente de Iluminación y Umbralización Adaptativa

8.14.9 EP08_09 🟠 Gradiente de Iluminación y Umbralización Adaptativa

En esta variación, los objetos están inmersos en un fondo con iluminación no uniforme (gradiente suave de iluminación). La umbralización simple por valor único falla, lo que exige un preprocesamiento más robusto.

8.14.9.1 📋 Directrices de Implementación

  1. Entrada: imagen en niveles de gris \(H \times W\) con variación de fondo de \(20\) a \(180\).
  2. Preprocesamiento:
  • Aplicar Umbralización Adaptativa (ej.: cv2.adaptiveThreshold con ventana gaussiana de \(15 \times 15\) y constante \(C = 3\)) para aislar los objetos independientemente de la variación del fondo.

    cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, ksize, C) // 255

    ksize y C se leen después de la imagen.

  • Operación morfológica de Cierre (\(3 \times 3\)) para sellar posibles fallos en los contornos.

  1. Medición y Clasificación: extraer las medidas.

  2. Ordenación y Salida: ordenar por (bbox[0], bbox[1]) e imprimir la tabla incluyendo la columna class.

    • Para ordenar, usar medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), con medidas = mm.measure(img, precision=0.02).

8.14.9.2 📌 Ejemplos

Entrada Salida
16 32
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
…
k 20
id area perimeter cx cy x y w h circularity solidity vertices
1 9.0 12.0 10.0 5.0 8 3 5 5 0.79 1.000 4
2 28.3 18.8 25.0 12.0 22 9 7 7 1.00 1.000 3
🧮 Simulador EP08_09: Gradiente de Iluminación y Umbral Adaptativo & Medición OpenCV Adaptativo vs Global → Medición
ETAPA DEL PROCESAMIENTO
VISUALIZACIÓN DE LA MATRIZ DE PÍXELES
TABLA DE MEDICIONES DE LOS OBJETOS (CALCULADA EN EL UMBRAL ADAPTATIVO CORRECTO)
id area perímetro cx cy x y w h circularidad solidez vértices
Figura 8.23: Simulador EP08_09: Gradiente de Iluminação, Limiar Adaptativo y Medición OpenCV
%%writefile EP08_09.py
# Código Python
Overwriting EP08_09.py
TestSuite("EP08_09.py").run()
✔️ EP08_09.cases ya existe en casos/
📋 3 caso(s) cargado(s) de casos/EP08_09.cases

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