PDI+VC · Ejercicio de Programación

EP06_02 — 🟢 Filtro de Marcadores por Circularidad

6.14.2 EP06_02 🟢 Filtro de Marcadores por Circularidad

Tras la segmentación de una imagen, es común que se identifiquen diversos componentes conexos. En aplicaciones como la rectificación de documentos, solo algunos de estos componentes corresponden a los marcadores de referencia utilizados para el alineamiento de la imagen. Un criterio empleado con frecuencia para seleccionar estos marcadores es la circularidad, que mide cuán cercana es la forma de un componente a un círculo.

En este ejercicio, cada componente se describe por su área \(A\) y su perímetro \(P\). El objetivo es calcular su circularidad y decidir, a partir de un umbral proporcionado, si el componente debe ser aceptado o rechazado como candidato a marcador.

6.14.2.1 📋 Directrices de Implementación

  1. Cantidad: Leer el entero \(N\) (número de candidatos) y el umbral de circularidad \(C_{\text{umbral}}\) (número real).
  2. Datos de los candidatos: Para cada uno de los \(N\) candidatos, leer el área \(A\) (entero) y el perímetro \(P\) (número real).
  3. Circularidad: Calcular \(C=\frac{4\pi A}{P^2}\), donde:
  • \(A\) es el área del componente;
  • \(P\) es el perímetro del componente;
  • \(C\) es la circularidad.
  1. Caso degenerado: Si \(P=0\), considerar \(C=0\) y clasificar directamente al candidato como RECHAZADO.
  2. Clasificación: Si \(C>C_{\text{umbral}}\), clasificar al candidato como ACEPTADO; en caso contrario, clasificarlo como RECHAZADO.
  3. Redondeo: Mostrar el valor de \(C\) con cuatro decimales.
  4. Salida: Para cada candidato, imprimir el valor de \(C\) seguido de la clasificación. Al final, imprimir el número total de candidatos aceptados.

6.14.2.2 📌 Restricciones Computacionales

  • Utilizar la constante \(\pi\) de la biblioteca estándar del lenguaje (por ejemplo, math.pi), sin aproximaciones.
  • La comparación debe realizarse con el valor de \(C\) en precisión completa, antes del redondeo para la visualización.
  • El criterio de aceptación es estricto (\(C>C_{\text{umbral}}\)).
  • Si \(P=0\), no se debe realizar la división.

6.14.2.3 🧠 Fundamentación Teórica

La circularidad es un descriptor geométrico definido por \(C=\frac{4\pi A}{P^2}\), donde:

  • \(A\) es el área del componente;
  • \(P\) es el perímetro del componente;
  • \(C\) es la circularidad.

Para un círculo perfecto, \(C=1\). A medida que la forma se vuelve más alargada o irregular, el perímetro crece más rápidamente que el área, reduciendo el valor de \(C\).

Forma Circularidad aproximada Interpretación
Círculo \(1{,}0000\) Forma circular.
Cuadrado \(0{,}7854\) Forma aproximadamente compacta.
Forma alargada o irregular \(C\ll1\) Baja circularidad.
\(P=0\) \(0\) (convención adoptada) Contorno degenerado.

La circularidad es invariante a la traslación, la rotación y la escala, y se utiliza ampliamente para distinguir componentes aproximadamente circulares de otros formatos.

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

Entrada:

  • Línea 1: entero \(N\).
  • Línea 2: número real \(C_{\text{umbral}}\).
  • Siguientes \(N\) líneas: área \(A\) (entero) y perímetro \(P\) (real), separados por espacio.

Salida:

  • Una línea para cada candidato, en el formato C ACEPTADO o C RECHAZADO, con \(C\) presentado con cuatro decimales.
  • Última línea: Total aceptados: X.

6.14.2.5 📌 Ejemplos

Entrada Salida Observación
3
0.6
78 31.4
100 40
50 60
0.9941 ACEPTADO
0.7854 ACEPTADO
0.1745 RECHAZADO
Total aceptados: 2
Candidato aproximadamente circular, forma compacta y forma alargada.
1
0.9
10 0
0.0000 RECHAZADO
Total aceptados: 0
Perímetro nulo: contorno degenerado.
🎮 Simulador EP06_02: Filtro de Marcadores por Circularidad C = 4πA / P²
Ajuste el umbral y observe qué candidatos (discos, cuadrados y formas irregulares) sobreviven al filtro.
–
Figura 6.22: Simulador EP06_02: Filtro de Marcadores por Circularidad
%%writefile EP06_02.py
# Código Python
Overwriting EP06_02.py
TestSuite("EP06_02.py").run()
✔️ EP06_02.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP06_02.cases

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