EDI+VA · Esercizio di Programmazione

EP02_06 — 🔄 Rotazione dell’Immagine

2.12.6 EP02_06 🔄 Rotazione dell’Immagine

In questa attività, devi implementare la rotazione di un’immagine attorno al suo centro geometrico. Questa operazione richiede il mapping delle coordinate e l’uso di tecniche di interpolazione per determinare i nuovi valori dei pixel.

  • Leggi due interi L e C, che rappresentano le dimensioni della matrice.
  • Leggi un valore reale \(\theta\) (angolo in gradi) e una stringa che rappresenta il metodo di interpolazione (nearest o bilinear).
  • Leggi i valori interi della matrice originale.
  • Esegui la rotazione attorno al centro dell’immagine \((L/2, C/2)\).
  • Stampa la matrice risultante con le stesse dimensioni dell’originale.
  • Vedi in Figura 2.17 una simulazione di questo EP.

📌 Importante:

  • Mapping Inverso: Per evitare “buchi” nell’immagine finale, percorri ogni pixel \((x', y')\) dell’immagine di destinazione e calcola la sua posizione corrispondente \((x, y)\) nell’immagine originale usando la matrice di rotazione inversa.

  • Interpolazione:

  • nearest: Assegna il valore del pixel più vicino alla coordinata calcolata.

  • bilinear: Calcola una media ponderata basata sui 4 vicini più prossimi.

  • Bordi: I pixel la cui origine \((x, y)\) cade fuori dai limiti dell’immagine originale devono essere riempiti con 0.

2.12.6.1 🧠 Trasformazione per Angolo

La rotazione di un punto \((x, y)\) rispetto all’origine di un angolo \(\theta\) è data dalla matrice di trasformazione. Per ruotare attorno a un centro \((x_c, y_c)\), prima trasliamo il centro nell’origine, ruotiamo e trasliamo di nuovo:

\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta & x_c \\ \sin\theta & \cos\theta & y_c \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x-x_c \\ y-y_c \\ 1 \end{bmatrix}\]

Suggerimento: Usa il mapping inverso per garantire che tutti i pixel dell’immagine di uscita siano riempiti correttamente.

2.12.6.2 📋 Compito (specifica per VPL)

Input:

La prima riga contiene L.

La seconda riga contiene C.

La terza riga contiene l’angolo theta (in gradi) e il metodo interp (nearest o bilinear).

Le righe successive contengono gli elementi della matrice \(L \times C\).

Output:

La matrice ruotata con L righe e C colonne.

2.12.6.3 📌 Esempi

Input Output Osservazione
2
2
90 nearest
1 2
3 4
3 1
4 2
Rotazione di 90° in senso orario: la colonna 0 diventa la riga 0 (dal basso verso l’alto). \((0,0)=1→(1,0)\), \((1,0)=3→(0,0)\), \((0,1)=2→(1,1)\), \((1,1)=4→(0,1)\).
3
3
45 bilinear
0 0 0
0 255 0
0 0 0
0 180 0
180 255 180
0 180 0
Rotazione di 45°: il pixel centrale rimane \(255\); i vicini diretti ricevono un valore interpolato \(\approx 180\) tramite bilineare; gli angoli rimangono \(0\).
🔄 Simulatore EP02_06: Rotazione Geometrica 2D x' = x·cosθ − y·sinθ | y' = x·sinθ + y·cosθ

Regola l'angolo di rotazione (θ) tramite slider o scorciatoie rapide per osservare la trasformazione trigonometrica delle coordinate attorno al centro dell'immagine.

0°

● Quadrato verde con marcatore arancione (angolo in alto a destra) – rotazione attorno al centro.

θ = 0° → cos = 1.000, sin = 0.000 → Matrice Identità
Figura 2.17: Simulatore EP02_06: Rotazione dell’immagine attorno all’origine di un angolo θ
%%writefile EP02_06.py
# Codice Python
Overwriting EP02_06.py
TestSuite("EP02_06.py").run()
✔️ EP02_06.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP02_06.cases

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