EDI+VA · Esercizio di Programmazione

EP02_09 — 🧩 Trasformazione Affine Generica

2.12.9 EP02_09 🧩 Trasformazione Affine Generica

In questa attività, devi implementare una trasformazione affine arbitraria su un’immagine. Questa operazione è la generalizzazione di tutte le trasformazioni lineari (scala, rotazione, taglio) combinate con la traslazione, consentendo manipolazioni geometriche complesse attraverso un’unica matrice.

  • Leggi due interi L e C, che rappresentano le dimensioni della matrice.
  • Leggi sei valori reali (\(a, b, t_x, c, d, t_y\)) che compongono la matrice di trasformazione affine \(2 \times 3\).
  • Leggi una stringa che rappresenta il metodo di interpolazione (nearest o bilinear).
  • Leggi i valori interi della matrice originale.
  • Applica la trasformazione mantenendo la dimensione originale \(L \times C\).
  • Stampa la matrice risultante.
  • Vedi in Figura 2.20 una simulazione di questo EP.

📌 Importante:

  • Mappatura inversa: Per calcolare il valore di ogni pixel nell’immagine di destinazione, devi utilizzare l’inversa della matrice di trasformazione affine fornita per trovare la coordinata corrispondente nell’immagine originale.
  • Riempimento: Le coordinate calcolate che cadono al di fuori dei limiti \([0, L-1]\) e \([0, C-1]\) dell’immagine originale devono risultare in un pixel di valore 0.
  • Flessibilità: Questa implementazione deve essere in grado di eseguire uno qualsiasi dei compiti precedenti (traslazione, rotazione, ecc.) semplicemente modificando i parametri della matrice.

Suggerimento:

flags = cv2.INTER_NEAREST if interp == 'nearest' else \
        cv2.INTER_CUBIC   if interp == 'bicubic'  else \
        cv2.INTER_LANCZOS4 if interp == 'lanczos' else \
        cv2.INTER_LINEAR

r = cv2.warpAffine(img, M, (C, L), flags=flags)

2.12.9.1 🧠 Combinazione di Operazioni

La trasformazione affine preserva punti, rette e piani. Nell’elaborazione delle immagini, mappa la posizione \((x, y)\) in \((x', y')\) seguendo il sistema:

\[\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \end{bmatrix}\]

Oppure, in forma compatta in coordinate omogenee:

\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]

2.12.9.2 📋 Compito (specifica per VPL)

Input:

La prima riga contiene L.

La seconda riga contiene C.

La terza riga contiene sei float: a b tx c d ty.

La quarta riga contiene il metodo interp (nearest o bilinear).

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

Output:

La matrice trasformata con le dimensioni originali \(L \times C\).

2.12.9.3 📌 Esempi

Input Output Osservazione
2
2
1.0 0.0 0.5 0.0 1.0 0.5
bilinear
10 20
30 40
15 20
25 30
Traslazione frazionaria \((t_x=0.5, t_y=0.5)\): ogni pixel di output \((i,j)\) campiona la posizione \((i+0.5,\, j+0.5)\) dell’input tramite bilineare. Es: \((0,0)\) interpola i quattro vicini \(→15\).
3
3
2.0 0.0 0.0 0.0 2.0 0.0
nearest
1 2 3
4 5 6
7 8 9
1 1 2
1 1 2
4 4 5
Scala \(2\times\) tramite matrice affine \((a=2, d=2)\): ogni pixel di output \((i,j)\) campiona la posizione \((2i, 2j)\) dell’input con nearest. Es: \((0,2)→(0,4)\) fuori dall’immagine \(→\) nearest blocca a \((0,2)=3\)… in attesa di conferma della logica di bordo.
📐 Simulatore EP02_09: Trasformazione Affine 2D [x'] = [a b tx]·[x y 1]ᵀ

Regola i parametri della matrice affine 2×3 (rotazione, scala, taglio e traslazione) e osserva l'effetto applicato sulla figura di riferimento.

Matrice affine 2×3
a b tx
c d ty

● Freccia arancione (punta triangolare) + corpo rettangolare nero. La trasformazione affine è applicata all'intera figura.

Matrice = [[1.0, 0.0, 0], [0.0, 1.0, 0]] → trasformazione identità.
Figura 2.20: Simulatore EP02_09: Trasformazione Affine 2D (Matrice 2×3)
%%writefile EP02_09.py
# Codice Python
Overwriting EP02_09.py
TestSuite("EP02_09.py").run()
✔️ EP02_09.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP02_09.cases

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