| id | area | perimetro | cx | cy | x | y | w | h | circolarità | solidità | vertici |
|---|
8.14.7 EP08_07 🟡 Rimozione del Rumore Sale e Pepe e Misurazione degli Oggetti
In questo esercizio, applicherai il filtraggio morfologico per pulire un’immagine binaria corrotta da rumore di tipo sale e pepe (pixel isolati di valore 1 nello sfondo e 0 all’interno degli oggetti). Dopo la pulizia, il programma deve estrarre le misurazioni geometriche dei componenti connessi rimanenti, ordinarli e visualizzare la tabella finale delle metriche.
8.14.7.1 📋 Linee Guida di Implementazione
Input: leggere due interi \(H\) e \(W\) (altezza e larghezza dell’immagine) nella prima riga e, successivamente, le \(H\) righe con la matrice binaria contenente pixel
0e1separati da spazio.Filtraggio Morfologico: applicare una sequenza di Apertura (per eliminare il rumore “sale” sullo sfondo) seguita da Chiusura (per riempire il rumore “pepe” all’interno degli oggetti) con elemento strutturante \(3 \times 3\).
Stampa dell’Immagine Pulita: stampare la matrice risultante in valori
0e1separati da spazio.Misurazioni Geometriche: per ogni oggetto identificato nella matrice pulita, estrarre:
id: identificatore numerico sequenziale (riassegnato dopo l’ordinamento);area: area calcolata tramite contorno (cv2.contourArea);perimeter: perimetro del contorno (cv2.arcLength);cx,cy: centro di massa (centroide tramitecv2.moments);x,y,w,h: coordinate del rettangolo delimitatore (cv2.boundingRect);circularity: circolarità data da \(\frac{4 \pi \cdot \text{area}}{\text{perimetro}^2}\);solidity: solidità data dal rapporto \(\frac{\text{area}}{\text{area dell'inviluppo convesso}}\);vertices: numero di vertici approssimato del poligono (cv2.approxPolyDPcon \(\epsilon = 0.02 \times \text{perimetro}\)).
- Ordinamento e Uscita: ordinare gli oggetti in ordine crescente in base alla posizione \(X\) del rettangolo delimitatore (
bbox[0]); in caso di parità, utilizzare la posizione \(Y\) (bbox[1]). Riassegnare gliidda \(1\) a \(N\) e stampare la tabella formattata.- Per ordinare, utilizzare
medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), conmedidas = mm.measure(img).
- Per ordinare, utilizzare
8.14.7.2 📌 Vincoli e Regole di Ordinamento
- Regola di Ordinamento degli Oggetti:
medidas.sort(key=lambda m: (m['bbox'][0], m['bbox'][1]))- Differenza di Area: L’area calcolata da OpenCV (
cv2.contourArea) misura l’area del poligono continuo delimitato dai centri dei pixel di bordo, risultando in valori numerici inferiori rispetto al semplice conteggio discreto dei pixel1(np.sum).
8.14.7.3 🧠 Fondamenti Teorici
| Operazione / Metrica | Funzione nel Filtraggio e nella Caratterizzazione |
|---|---|
| Apertura Morfologica (\(\circ\)) | Erosione seguita da dilatazione: rimuove rumori brillanti isolati (sale). |
| Chiusura Morfologica (\(\bullet\)) | Dilatazione seguita da erosione: riempie piccoli fori scuri all’interno degli oggetti (pepe). |
cv2.boundingRect |
Restituisce \((x, y, w, h)\), il più piccolo rettangolo allineato agli assi che racchiude l’oggetto. |
| Circolarità e Solidità | Descrivono la compattezza e la convessità geometrica del componente. |
8.14.7.4 📌 Esempi
| Input | Output |
|---|---|
| 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
# Codice PythonOverwriting EP08_07.py
TestSuite("EP08_07.py").run()✔️ EP08_07.cases esiste già in casos/
📋 4 caso/i caricato/i da casos/EP08_07.cases
🔍 Test di Python: EP08_07.py
⚠️ EP08_07.py: file vuoto (meno di 3 righe). Test saltati.