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
- Quantità: Leggere l’intero \(N\) (numero di candidati) e la soglia di circolarità \(C_{\text{limiar}}\) (numero reale).
- Dati dei candidati: Per ciascuno degli \(N\) candidati, leggere l’area \(A\) (intero) e il perimetro \(P\) (numero reale).
- Circolarità: Calcolare \(C=\frac{4\pi A}{P^2}\), dove:
- \(A\) è l’area del componente;
- \(P\) è il perimetro del componente;
- \(C\) è la circolarità.
- Caso degenere: Se \(P=0\), considerare \(C=0\) e classificare direttamente il candidato come
REJEITADO. - Classificazione: Se \(C>C_{\text{limiar}}\), classificare il candidato come
ACEITO; altrimenti, classificarlo comeREJEITADO. - Arrotondamento: Visualizzare il valore di \(C\) con quattro cifre decimali.
- 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 ACEITOoC 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. |
%%writefile EP06_02.py
# Codice PythonOverwriting 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.