Trova la funzione di trasformazione per il punto su un'immagine

2

Sto cercando di sviluppare un algoritmo, ma riesco a malapena a descriverlo, quindi non sono sicuro di cosa cercare. Ho due immagini img_A e img_B. img_A è l'originale, mentre img_B è un'immagine dello stesso elemento ma leggermente diversa. Diciamo che una è una foto di una persona, mentre l'altra è un disegno di quella stessa persona. Ciò significa che img_B è molto simile a img_A, ma potrebbe essere leggermente ruotato e forse un po 'più grande / più piccolo.

Quello che sto cercando di fare è: da un punto di img_A a_a ottieni il corrispondente a_b su img_B. Penso di aver bisogno di definire due punti su img_A e i loro punti di correzione su img_B per definire la corrispondenza degli assi. Una volta che ho quei 4 punti, calcolo a_b. I 4 "punti dell'asse" saranno definiti a mano una volta, quindi l'utente selezionerà un punto "a_a" a mano e verrà calcolato il valore corretto "a_b".

Su un esempio visivo: seleziono il centro dell'occhio sinistro e il punto inferiore del mento da entrambe le immagini. Quindi seleziono l'occhio destro da img_A e come risultato ottengo le coordinate di a_b. (se il disegno è stato eseguito perfettamente, le coordinate di a_b corrisponderanno all'occhio destro su img_b).

Come sviluppo questo? Ho bisogno di una matrice per moltiplicare a_a per ottenere a_b? come?

    
posta maugch 12.12.2016 - 15:43
fonte

1 risposta

2

Stai cercando una trasformazione affine del modulo

f(v) = s * R * v + t

dove v è un vettore 2D nel sistema di coordinate dell'immagine A, s è un fattore di scala (valore reale positivo), R è una matrice di rotazione 2x2 del modulo

 [cos(alpha)   sin(alpha)]
 [-sin(alpha)  cos(alpha)]

e t è un vettore 2D, la traduzione. f(v) quindi ti dà il punto corrispondente nell'immagine B. Quindi ciò che devi calcolare è s, alpha et.

Supponiamo tu abbia due punti p1 e p2 nel sistema di coordinate dell'immagine A e due punti corrispondenti q1 e q2 nel sistema di coordinate dell'immagine B. Quindi puoi facilmente calcolare s = |q2-q1|/|p2-p1| . L'angolo alpha è la differenza di angolo tra gli angoli di direzione del vettore da p1 a p2 e il vettore da q1 a q2. L'angolo di direzione per p1 a p2 è calcolato da atan(dy/dx) dove dx e dy sono le coordinate x e y di p2-p1 (per q1 a q2 funziona in modo simile). Per evitare problemi con un denominatore zero e il segno, usa la funzione atan2 , che è disponibile in molti linguaggi di programmazione.

Quindi ora hai s e R , e da f(p1)=q1 puoi ora dedurre

t= q1- s * R * p1

che ti dà finalmente la traduzione t .

    
risposta data 12.12.2016 - 18:34
fonte

Leggi altre domande sui tag