Analizza la scomposizione orizzontale (Gx) e verticale (Gy) dell'operatore di Sobel e passa il mouse sui pixel della magnitudine per ispezionare l'intorno 3×3.
3.12.8 EP03_08 🧭 Gradiente di Sobel: Gx e Gy
Nei robot esploratori di Marte (come il Perseverance), il rilevamento degli ostacoli viene eseguito in tempo reale da telecamere stereoscopiche. L’operatore di Sobel calcola il gradiente direzionale della scena e viene utilizzato nell’algoritmo di rilevamento dei bordi per identificare rocce, crepe e dislivelli del terreno che potrebbero compromettere la navigazione.
Vedi in Figura 3.33 una simulazione di questo EP.
3.12.8.1 📋 Linee guida di implementazione
- Dimensioni: Leggere gli interi \(L\) (righe) e \(C\) (colonne).
- Dati: Leggere la matrice \(f\).
- Gx e Gy: Per ogni pixel interno \((i,j)\) con \(1 \le i < L-1\), \(1 \le j < C-1\):
\[G_x(i,j) = [f(i-1,j+1) + 2f(i,j+1) + f(i+1,j+1)] - [f(i-1,j-1) + 2f(i,j-1) + f(i+1,j-1)]\]
\[G_y(i,j) = [f(i+1,j-1) + 2f(i+1,j) + f(i+1,j+1)] - [f(i-1,j-1) + 2f(i-1,j) + f(i-1,j+1)]\]
- Magnitudo: \(|\nabla f(i,j)| = \text{clip}(\text{round}(\sqrt{G_x^2 + G_y^2}))\).
- Bordo: I pixel di bordo ricevono magnitudo 0.
- Output: Visualizzare il magnitudo \(L \times C\).
3.12.8.2 📌 Vincoli computazionali
- Arrotondamento: Applicare
roundprima di convertire in intero. - Saturazione: \(\text{clip}(x) = \max(0, \min(255, x))\).
- Radice quadrata: Usare \(\sqrt{G_x^2 + G_y^2}\) (non l’approssimazione \(|G_x| + |G_y|\)).
3.12.8.3 🧠 Fondamenti teorici
| Operatore | Rileva | Coefficienti diagonali |
|---|---|---|
| \(G_x\) | Bordi verticali | \(\pm 1\) |
| \(G_y\) | Bordi orizzontali | \(\pm 1\) |
| \(|\nabla f|\) | Tutti i bordi | Combinato |
3.12.8.4 📦 Specifica di input e output (VPL)
Input:
- Riga 1: Intero \(L\).
- Riga 2: Intero \(C\).
- Righe successive: Elementi della matrice.
Output:
- Magnitudo del gradiente, matrice \(L \times C\).
3.12.8.5 📌 Esempi
| Input | Output | Osservazione |
|---|---|---|
| 3 3 0 0 0 0 0 0 0 0 0 |
0 0 0 0 0 0 0 0 0 |
Immagine nulla: gradiente zero |
| 3 3 0 0 255 0 0 255 0 0 255 |
0 0 0 0 255 0 0 0 0 |
Bordo verticale centrale: Gx alto |
🧭 Simulatore EP03_08: Gradiente di Sobel (Gx e Gy)
|∇f| = √(Gx² + Gy²)
Kernel di Sobel:
−1
0
+1
−2
0
+2
−1
0
+1
−1
−2
−1
0
0
0
+1
+2
+1
Immagine Originale f
Matrice 5×5 pixel
Magnitudine |∇f|
√(Gx² + Gy²)
Gx — Gradiente Orizzontale
Blu = Negativo · Bianco = Zero · Blu Vivo = Positivo
Gy — Gradiente Verticale
Ambra = Negativo · Bianco = Zero · Ambra Viva = Positivo
Legenda:
Intorno 3×3 Ispezionato
Pixel Centrale
Bordo (Forzato a 0)
Passa il mouse su un pixel interno della magnitudine per vedere la scomposizione Gx e Gy.
%%writefile EP03_08.cpp
// your solutionOverwriting EP03_08.cpp
TestSuite("EP03_08.cpp").run()✔️ EP03_08.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP03_08.cases
🔍 Test di C++: EP03_08.cpp
⚠️ EP03_08.cpp: file vuoto (meno di 3 righe). Test saltati.