| id | area | perimeter | cx | cy | x | y | w | h | circularity | solidity | vertices |
|---|
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
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
0y1separados por espacio.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\).
Impresión de la Imagen Limpia: imprimir la matriz resultante en valores
0y1separados por espacio.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 mediantecv2.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.approxPolyDPcon \(\epsilon = 0.02 \times \text{perímetro}\)).
- 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 losids de \(1\) a \(N\) e imprimir la tabla formateada.- Para ordenar, usar
medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), conmedidas = mm.measure(img).
- Para ordenar, usar
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íxeles1(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 |
%%writefile EP08_07.py
# Código PythonOverwriting 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.