Regola i coefficienti di taglio orizzontale (shx) e verticale (shy) per osservare la deformazione angolare dell'immagine tramite mappatura inversa delle coordinate.
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 (
nearestobilinear). - 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\). |
%%writefile EP02_08.py
# Codice PythonOverwriting 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.