Domanda

Sto cercando di eseguire un'inclinazione su un'immagine, come quella mostrata qui


(fonte: microsoft.com)
.

Ho una serie di pixel che rappresentano la mia immagine e non sono sicuro di cosa farne.

È stato utile?

Soluzione

Un modo molto migliore per farlo è tramite mappatura inversa.

In sostanza, vuoi "deformare" l'immagine, giusto?Ciò significa che ogni pixel nell'immagine sorgente va in un punto predefinito: la predefinizione è una matrice di trasformazione che ti dice come ruotare, ridimensionare, traslare, inclinare, ecc.l'immagine che essenzialmente assume alcune coordinate (x,y) sulla tua immagine e dicendo: "Ok, la nuova posizione per questo pixel è (f(x),g(y)).

Questo è essenzialmente ciò che fa la "deformazione".

Ora, pensa a ridimensionare un'immagine...diciamo, dieci volte più grande.Ciò significa che il pixel at (1,1) diventa il pixel in (10,10) - e poi il pixel successivo, (1,2) diventa il pixel (10,20) nella nuova immagine.Ma se continui a farlo, non avrai valori per un pixel, (13,13) Perché, (1.3,1.3) non è definito nella tua immagine originale e avrai un sacco di buchi nella tua nuova immagine: dovrai interpolare per quel valore usando i quattro pixel attorno ad esso nella nuova immagine, cioè (10,10) , (10,20), (20,10), (200,2) - questo è chiamato interpolazione bilineare.

Ma ecco un altro problema, supponiamo che la tua trasformazione non fosse un semplice ridimensionamento e fosse affine (come l'immagine di esempio che hai pubblicato), quindi (1,1) diventerebbe qualcosa di simile (2.34,4.21) e quindi dovresti arrotondarli nell'immagine di output (2,4) E Poi dovresti fare un'interpolazione bilineare sulla nuova immagine per riempire i buchi o un'interpolazione più complicata - disordinata, vero?

Ora, c'è non c'è modo per uscire dall'interpolazione, ma possiamo cavarcela facendo semplicemente l'interpolazione bilineare una volta.Come?Semplice, mappatura inversa.

Invece di considerarla come l'immagine sorgente che va alla nuova immagine, pensa a dove verranno i dati per la nuova immagine nell'immagine sorgente!COSÌ, (1,1) nella nuova immagine deriverà da una mappatura inversa nell'immagine sorgente, ad esempio: (3.4, 2.1) e poi esegui l'interpolazione bilineare sull'immagine sorgente per capire il valore corrispondente!

Matrice di trasformazione

Ok, quindi come si definisce una matrice di trasformazione per una trasformazione affine? Questo sito web ti dice come farlo componendo diverse matrici di trasformazione per rotazione, taglio, ecc.

Trasformazioni:

alt text

Composizione:

alt text

La matrice finale può essere ottenuta componendo ciascuna matrice nell'ordine e tu invertire per ottenere la mappatura inversa: usalo per calcolare le posizioni dei pixel nell'immagine sorgente e interpolare.

Altri suggerimenti

Se non avete voglia di re-inventare la ruota, controlla la libreria OpenCV. Implementa molte funzioni utili elaborazione di immagini compreso trasformazioni prospettiche. Controlla la cvWarpPerspective che ho usato per eseguire questa operazione abbastanza facilmente.

Come commentato da KennyTM è sufficiente una trasformazione affine che è una mappatura lineare ottenuto moltiplicando ogni pixel da una matrice M e aggiungendo il risultato a un vettore di traslazione V . E 'semplice matematica

end_pixel_position = M*start_pixel_position + V

dove M è una composizione di trasformazioni semplici come rotazioni o scaglie ed V è un vettore che traduce ogni punto delle immagini con l'aggiunta di coefficienti fissi ogni pixel.

Per esempio, se si desidera ruotare l'immagine che si può avere una matrice di rotazione definita come:

    | cos(a) -sin(a) |
M = |                |
    | sin(a)  cos(a) |

dove a è l'angolo che si desidera ruotare l'immagine da.

Mentre scalatura utilizza una matrice della forma:

    | s1   0 |
M = |        |
    | 0   s2 |

dove s1 e s2 sono fattori di scala su entrambi gli assi.

Per la traduzione basta il vettore di V :

    | t1 |
V = |    |
    | t2 |

che aggiunge t1 e t2 alle coordinate dei pixel.

È quindi combinare le matrici in una sola trasformazione, ad esempio se si hanno o ridimensionamento, rotazione e traslazione si finirà per avere qualcosa di simile:

| x2 |             | x1 |
|    | = M1 * M2 * |    | + T
| y2 |             | y1 |

dove:

  • x1 e y1 sono coordinate in pixel prima di applicare la trasformazione,
  • x2 e y2 sono pixel dopo la trasformazione,
  • M1 e M2 sono matrici utilizzate per il ridimensionamento e la rotazione ( Ricorda:! la composizione di matrici non è commutativa solito M1 * M2 * Vect != M2 * M1 * Vect),
  • T è un uso di traduzione vettore di tradurre ogni pixel.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top