EDI+VA · Esercizio di Programmazione

EP06_02 — 🟢 Filtro di Marcatori per Circolarità

6.14.2 EP06_02 🟢 Filtro di Marcatori per Circolarità

Dopo la segmentazione di un’immagine, è comune che vengano identificati diversi componenti connessi. In applicazioni come la rettifica di documenti, solo alcuni di questi componenti corrispondono ai marcatori di riferimento utilizzati per l’allineamento dell’immagine. Un criterio spesso impiegato per selezionare tali marcatori è la circolarità, che misura quanto la forma di un componente sia vicina a un cerchio.

In questo esercizio, ogni componente è descritto dalla sua area \(A\) e dal suo perimetro \(P\). L’obiettivo è calcolarne la circolarità e decidere, in base a una soglia fornita, se il componente debba essere accettato o rifiutato come candidato marcatore.

6.14.2.1 📋 Linee Guida di Implementazione

  1. Quantità: Leggere l’intero \(N\) (numero di candidati) e la soglia di circolarità \(C_{\text{limiar}}\) (numero reale).
  2. Dati dei candidati: Per ciascuno degli \(N\) candidati, leggere l’area \(A\) (intero) e il perimetro \(P\) (numero reale).
  3. Circolarità: Calcolare \(C=\frac{4\pi A}{P^2}\), dove:
  • \(A\) è l’area del componente;
  • \(P\) è il perimetro del componente;
  • \(C\) è la circolarità.
  1. Caso degenere: Se \(P=0\), considerare \(C=0\) e classificare direttamente il candidato come REJEITADO.
  2. Classificazione: Se \(C>C_{\text{limiar}}\), classificare il candidato come ACEITO; altrimenti, classificarlo come REJEITADO.
  3. Arrotondamento: Visualizzare il valore di \(C\) con quattro cifre decimali.
  4. Output: Per ogni candidato, stampare il valore di \(C\) seguito dalla classificazione. Alla fine, stampare il numero totale di candidati accettati.

6.14.2.2 📌 Vincoli Computazionali

  • Utilizzare la costante \(\pi\) della libreria standard del linguaggio (ad esempio, math.pi), senza approssimazioni.
  • Il confronto deve essere effettuato con il valore di \(C\) a piena precisione, prima dell’arrotondamento per la visualizzazione.
  • Il criterio di accettazione è stretto (\(C>C_{\text{limiar}}\)).
  • Se \(P=0\), la divisione non deve essere eseguita.

6.14.2.3 🧠 Fondamenti Teorici

La circolarità è un descrittore geometrico definito da \(C=\frac{4\pi A}{P^2}\), dove:

  • \(A\) è l’area del componente;
  • \(P\) è il perimetro del componente;
  • \(C\) è la circolarità.

Per un cerchio perfetto, \(C=1\). Man mano che la forma diventa più allungata o irregolare, il perimetro cresce più rapidamente dell’area, riducendo il valore di \(C\).

Forma Circolarità approssimata Interpretazione
Cerchio \(1{,}0000\) Forma circolare.
Quadrato \(0{,}7854\) Forma approssimativamente compatta.
Forma allungata o irregolare \(C\ll1\) Bassa circolarità.
\(P=0\) \(0\) (convenzione adottata) Contorno degenere.

La circolarità è invariante rispetto a traslazione, rotazione e scala, ed è ampiamente utilizzata per distinguere componenti approssimativamente circolari da altre forme.

6.14.2.4 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: intero \(N\).
  • Riga 2: numero reale \(C_{\text{limiar}}\).
  • Successive \(N\) righe: area \(A\) (intero) e perimetro \(P\) (reale), separati da spazio.

Output:

  • Una riga per ogni candidato, nel formato C ACEITO o C REJEITADO, con \(C\) presentato con quattro cifre decimali.
  • Ultima riga: Total aceitos: X.

6.14.2.5 📌 Esempi

Input Output Osservazione
3
0.6
78 31.4
100 40
50 60
0.9941 ACEITO
0.7854 ACEITO
0.1745 REJEITADO
Total aceitos: 2
Candidato approssimativamente circolare, forma compatta e forma allungata.
1
0.9
10 0
0.0000 REJEITADO
Total aceitos: 0
Perimetro nullo: contorno degenere.
🎮 Simulatore EP06_02: Filtro dei Marcatori per Circolarità C = 4πA / P²
Regola la soglia e osserva quali candidati (dischi, quadrati e forme irregolari) sopravvivono al filtro.
–
Figura 6.22: Simulatore EP06_02: Filtro di Marcatori per Circolarità
%%writefile EP06_02.py
# Codice Python
Overwriting EP06_02.py
TestSuite("EP06_02.py").run()
✔️ EP06_02.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP06_02.cases

🔍 Test di Python: EP06_02.py
⚠️ EP06_02.py: file vuoto (meno di 3 righe). Test saltati.