PDI+VC · Ejercicio de Programación

EP08_07 — 🟡 Eliminación de Ruido Sal y Pimienta y Medición de Objetos

8.14.7 EP08_07 🟡 Eliminación de Ruido Sal y Pimienta y Medición de Objetos

En este ejercicio, usted aplicará filtrado morfológico para limpiar una imagen binaria corrompida por ruido del tipo sal y pimienta (píxeles aislados de valor 1 en el fondo y 0 en el interior de los objetos). Después de la limpieza, el programa debe extraer las mediciones geométricas de los componentes conectados restantes, ordenarlos y mostrar la tabla final de métricas.

8.14.7.1 📋 Directrices de Implementación

  1. Entrada: leer dos enteros \(H\) y \(W\) (alto y ancho de la imagen) en la primera línea y, a continuación, las \(H\) líneas con la matriz binaria que contiene píxeles 0 y 1 separados por espacio.

  2. Filtrado Morfológico: aplicar encadenamiento de Apertura (para eliminar el ruido sal en el fondo) seguido de Cierre (para rellenar el ruido pimienta dentro de los objetos) con elemento estructurante \(3 \times 3\).

  3. Impresión de la Imagen Limpia: imprimir la matriz resultante en valores 0 y 1 separados por espacio.

  4. Mediciones Geométricas: para cada objeto identificado en la matriz limpia, extraer:

  • id: identificador numérico secuencial (reasignado después de la ordenación);

  • area: área calculada mediante contorno (cv2.contourArea);

  • perimeter: perímetro del contorno (cv2.arcLength);

  • cx, cy: centro de masa (centroide mediante cv2.moments);

  • x, y, w, h: coordenadas del rectángulo delimitador (cv2.boundingRect);

  • circularity: circularidad dada por \(\frac{4 \pi \cdot \text{área}}{\text{perímetro}^2}\);

  • solidity: solidez dada por la razón \(\frac{\text{área}}{\text{área del casco convexo}}\);

  • vertices: número de vértices aproximado del polígono (cv2.approxPolyDP con \(\epsilon = 0.02 \times \text{perímetro}\)).

  1. Ordenación y Salida: ordenar los objetos en orden creciente por la posición \(X\) del rectángulo delimitador (bbox[0]); en caso de empate, usar la posición \(Y\) (bbox[1]). Reasignar los ids de \(1\) a \(N\) e imprimir la tabla formateada.
    • Para ordenar, usar medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), con medidas = mm.measure(img).

8.14.7.2 📌 Restricciones y Reglas de Ordenación

  • Regla de Ordenación de los Objetos:
medidas.sort(key=lambda m: (m['bbox'][0], m['bbox'][1]))
  • Diferencia de Área: El área calculada por OpenCV (cv2.contourArea) mide el área del polígono continuo delimitado por los centros de los píxeles de borde, resultando en valores numéricos menores que el simple conteo discreto de píxeles 1 (np.sum).

8.14.7.3 🧠 Fundamentación Teórica

Operación / Métrica Función en el Filtrado y Caracterización
Apertura Morfológica (\(\circ\)) Erosión seguida de dilatación: elimina ruidos brillantes aislados (sal).
Cierre Morfológico (\(\bullet\)) Dilatación seguida de erosión: rellena pequeños huecos oscuros en el interior de los objetos (pimienta).
cv2.boundingRect Devuelve \((x, y, w, h)\), el rectángulo más pequeño alineado a los ejes que envuelve al objeto.
Circularidad y Solidez Describen la compacidad y la convexidad geométrica del componente.

8.14.7.4 📌 Ejemplos

Entrada Salida
8 9
0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0
0 0 0 1 1 1 1 0 0
0 0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0
id area perimeter cx cy x y w h circularity solidity vertices
1 9.0 12.0 3.5 2.0 3 1 4 3 0.79 1.000 4
2 4.0 8.0 7.5 5.5 7 5 2 2 0.79 1.000 4
🧮 Simulador EP08_07: Morfología Conmutable (4-C / 8-C) & Métricas OpenCV Sal y Pimienta → Apertura → Cierre → Medición
ETAPA DEL PROCESAMIENTO MORFOLÓGICO
ELEMENTO ESTRUCTURANTE
EXHIBICIÓN DE LOS PÍXELES
VISUALIZACIÓN DE LA MATRIZ DE PÍXELES DE ENTRADA / PROCESADA
TABLA DE MEDICIONES DE LOS OBJETOS (CALCULADO DESPUÉS DE APERTURA Y CIERRE)
id area perimeter cx cy x y w h circularity solidity vertices
Figura 8.21: Simulador EP08_07: Morfología con Conectividad Configurable y Medición
%%writefile EP08_07.py
# Código Python
Overwriting EP08_07.py
TestSuite("EP08_07.py").run()
✔️ EP08_07.cases ya existe en casos/
📋 4 caso(s) cargado(s) de casos/EP08_07.cases

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