EDI+VA · Esercizio di Programmazione

EP02_08 — 🔀 Taglio (Shear)

2.12.8 EP02_08 🔀 Taglio (Shear)

In questa attività, devi implementare la trasformazione di taglio su un’immagine. Il taglio è una trasformazione affine che sposta ogni punto in una direzione fissa, di un valore proporzionale alla sua distanza da una retta parallela a tale direzione, producendo un effetto di inclinazione.

  • Leggi due interi L e C, che rappresentano le dimensioni della matrice.
  • Leggi due valori reali \(sh_x\) (taglio orizzontale) e \(sh_y\) (taglio verticale).
  • Leggi una stringa che rappresenta il metodo di interpolazione (nearest o bilinear).
  • Leggi i valori interi della matrice originale.
  • Applica la trasformazione mantenendo le dimensioni originali dell’immagine (tagliando ciò che supera i limiti).
  • Stampa la matrice risultante con le dimensioni \(L \times C\).
  • Vedi in Figura 2.19 una simulazione di questo EP.

📌 Importante:

  • Mapping inverso: Per ogni pixel \((x', y')\) dell’immagine di destinazione, calcola la posizione corrispondente nell’origine \((x, y)\) utilizzando la matrice di taglio inversa.
  • Riempimento: Le coordinate che risultano in posizioni fuori dalla matrice originale devono essere riempite con 0.
  • Coordinate: Ai fini di questa implementazione, considera \(x\) come indice di riga e \(y\) come indice di colonna.

2.12.8.1 🧠 Distorsione affine

Il taglio altera la geometria dell’immagine inclinandone gli assi. La relazione tra le coordinate originali \((x, y)\) e quelle trasformate \((x', y')\) è data da:

\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & sh_x & 0 \\ sh_y & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]

Questo produce le equazioni:

  • \(x' = x + sh_x \cdot y\)
  • \(y' = y + sh_y \cdot x\)

2.12.8.2 📋 Compito (specifica per VPL)

Input:

La prima riga contiene L.

La seconda riga contiene C.

La terza riga contiene i fattori shx e shy.

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 stesse dimensioni \(L \times C\).

2.12.8.3 📌 Esempi

Input Output Osservazione
3
3
0.5 0.0
nearest
10 20 30
40 50 60
70 80 90
10 20 30
0 40 50
0 0 70
Taglio orizzontale: la riga \(i\) si sposta di \(\lfloor i \cdot 0.5 \rfloor\) pixel. Riga \(0→0\)px, riga \(1→0\)px, riga \(2→1\)px. I pixel spostati fuori dai limiti vengono scartati e le posizioni vuote vengono riempite con \(0\).
2
2
0.0 1.0
nearest
10 20
30 40
10 0
30 20
Taglio verticale: la colonna \(j\) si sposta di \(\lfloor j \cdot 1.0 \rfloor\) pixel verso il basso. Colonna \(0→0\)px (invariata), colonna \(1→1\)px: \(20\) scende a \((1,1)\) e \((0,1)\) diventa \(0\).
✂️ Simulatore EP02_08: Taglio (Shear) 2D x' = x + shx·y | y' = y + shy·x

Regola i coefficienti di taglio orizzontale (shx) e verticale (shy) per osservare la deformazione angolare dell'immagine tramite mappatura inversa delle coordinate.

0.00
0.00
Originale (4×4)
Tagliata (Nearest Neighbor)
shx = 0.00, shy = 0.00 → nessuna deformazione angolare (immagine originale)
Figura 2.19: Simulatore EP02_08: Trasformazione Geometrica di Taglio 2D (Shear Orizzontale e Verticale)
%%writefile EP02_08.py
# Codice Python
Overwriting EP02_08.py
TestSuite("EP02_08.py").run()
✔️ EP02_08.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP02_08.cases

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