Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

5 votos

Cómo calcular qué matriz transformará los puntos especificados en otros puntos especificados

Quiero transformar una imagen.

Por lo que he podido averiguar, puedo conseguirlo con una matriz, ¿no?

Así que este es mi problema: ¿cómo puedo obtener esta matriz si lo único que conozco son los siguientes puntos de inicio y final?

Starting PointsTarget PointsTL(3,5)TL(0,3)TR(5,5)TR(3,3)LL(2,2)LL(0,0)LR(6,1)LR(3,0)

enter image description here

7voto

bubba Puntos 16773

Muchos paquetes gráficos tienen funciones para construir una transformación de 4 puntos a 4 puntos del tipo que usted necesita. Por ejemplo, Qt tiene QTransform::quadToSquare y QTransform::quadToQuad, y OpenCV tiene GetPerspectiveTransform.

La transformación no puede ser lineal o afín, tiene que ser una transformación "en perspectiva".

Si quieres codificarlo tú mismo, este artículo te dice cómo. Las fórmulas de ese artículo se muestran más claramente a continuación:

Si queremos transformar los cuatro puntos (xi,yi) a los cuatro puntos (ui,vi) para i=0,1,2,3 podemos utilizar una transformación de perspectiva de la forma ui=a0xi+a1yi+a2c0xi+c1yi+1;vi=b0xi+b1yi+b2c0xi+c1yi+1 Los ocho coeficientes desconocidos a0,a1,a2,b0,b1,b2,c0,c1 se puede calcular resolviendo el siguiente sistema lineal:

[x0y01000x0u0y0u0x1y11000x1u1y1u1x2y21000x2u2y2u2x3y31000x3u3y3u3000x0y01x0v0y0v0000x1y11x1v1y1v1000x2y21x2v2y2v2000x3y31x3v3y3v3][a0a1a2b0b1b2c0c1]=[u0u1u2u3v0v1v2v3]

Hay muchos paquetes de software disponibles para resolver sistemas lineales de ecuaciones. Una opción es el libro/paquete "Numerical Recipes", que tiene funciones llamadas ludcmp y lubksb. La primera de ellas calcula la descomposición LU de una matriz, y la segunda utiliza esta descomposición LU para resolver un sistema lineal. Hay una larga discusión sobre cómo usar ludcmp y lubksb aquí .

En su ejemplo particular, tenemos (x0,y0)=(3,5)(x1,y1)=(5,5)(x2,y2)=(2,2)(x3,y3)=(6,1)(u0,v0)=(0,3)(u1,v1)=(3,3)(u2,v2)=(0,0)(u3,v3)=(3,0) El sistema de ecuaciones es 3a0+5a1+a2=05a0+5a1+a215c015c1=32a0+2a1+a2=06a0+a1+a218c03c1=33b0+5b1+b29c015c1=35b0+5b1+b215c015c1=32b0+2b1+b2=06b0+b1+b2=0 He resuelto este sistema de ecuaciones utilizando Mathematica, y he obtenido a0=3649;a1=1249;a2=4849b0=24245;b1=96245;b2=4849c0=8245;c1=33245 Por lo tanto, la transformación requerida (después de algunas simplificaciones) es u=60(3xy4)8x33y+245v=24(x+4y10)8x33y+245 Puedes confirmar fácilmente que esta transformación mapea correctamente los cuatro puntos dados.

3voto

rretzbach Puntos 116

Busquemos una transformación afín para hacer lo que te gusta. Esta transformación actuará sobre puntos del plano (vectores en R2 ) y producirán puntos en el plano, y estarán dados por T(x)=Ax+v para alguna matriz A y el vector v que encontraremos. Como tomamos puntos en el plano y producimos puntos en el plano, A debe ser 2×2 , digamos que con entradas a,b,c,d y v también está en el plano, con entradas e,f .

Ahora sus puntos nos dan 8 restricciones sobre 6 variables a,b,c,d,e,f - vamos a escribir un par y puedes terminar el resto y simplemente resolver el sistema de ecuaciones lineales resultante (digamos, por eliminación gaussiana, o por Wolfram Alpha).

Mapas del primer punto (3,5)(0,3) así que 3a+5b+e=0 and 3c+5d+f=3 Mapas del segundo punto (5,5)(3,3) así que 5a+5b+e=3 and 5c+5d+f=3 Mapas del tercer punto (2,2)(0,0) así que 2a+2b+e=0 and 2c+2d+f=0 Mapas del cuarto punto (1,6)(3,0) así que 1a+6b+e=3 and 1c+6d+f=0

Resumiendo llegamos a resolver [351551221161][acbdef]=[03330030] Puedes usar los tres primeros para resolver y conectarlo al cuarto para comprobarlo.

2voto

John Gallagher Puntos 183

Lo que (presumiblemente) buscas realizar se llama transformación afín. Una transformación afín en dos dimensiones está determinada por cómo tres Transformación de puntos. Así que puede o no haber una que haga lo que quieres aquí. Es posible (y muy común en los gráficos por ordenador) representar una transformación afín como una transformación lineal mediante la adición de una dimensión extra, pero en esta coyuntura me gustaría especular que probablemente es mejor seguir con la forma afín por ahora.

0voto

Matti Viljanen Puntos 11

No has especificado si buscas una transformación lineal u otra. Dado que menciona la matriz y no las funciones de los puntos de inicio, estoy asumiendo que es una lineal que desea.

Dado que no se especifica ninguna otra condición (por ejemplo, la preservación de la longitud, los ángulos, etc.), sus coordenadas x e y no necesitan estar relacionadas por condiciones adicionales, por lo que puede escribir cada punto de inicio como (xi,yi) y cada punto de destino como (xi,yi) . Definir X=[x1...x4y1...y4] y Y=[x1...x4y1...y4] . A continuación, puede establecer un 8×8 sistema lineal Y=AX con los elementos de la matriz A como incógnitas. Sin embargo, tendrá que especificar otros 4 puntos ficticios y sus imágenes para obtener una posible solución matricial.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X