2010-07-18 5 views
0

j'ai posé une question concernant les transformations Bi linéaires et ont reçu cette réponse:Aide Comprendre ces équations?

À partir de cette même page que vous avez publié, il y a un lien vers le code de la source . Je vais vous expliquer la transformation bilinéaire en

http://www.antigrain.com/__code/include/agg_trans_bilinear.h.html

L'idée ici est de trouver une transformation de la forme:

output_x = a * input_x + b * input_x * input_y + c * input_y + d 
output_y = e * input_x + f * input_x * input_y + g * input_y + h 

Le terme « bilinéaire » vient de chacun de ces équations étant linéaire l'une des coordonnées d'entrée par eux-mêmes. Nous voulons résoudre pour les bonnes valeurs de a, b, c et d. Dites que vous avez la référence rectangle r1, r2, r3, r4 que vous souhaitez mapper à (0,0), (1,0), (0,1), (1,1) (ou un système de coordonnées d'image).

a, b, c, d:

0 = a * r1_x + b * r1_x * r1_y + c * r1_y + d 
1 = a * r2_x + b * r2_x * r2_y + c * r2_y + d 
0 = a * r3_x + b * r3_x * r3_y + c * r3_y + d 
1 = a * r4_x + b * r4_x * r4_y + c * r4_y + d 

Pour e, f, g, h:

0 = e * r1_x + f * r1_x * r1_y + g * r1_y + h 
0 = e * r2_x + f * r2_x * r2_y + g * r2_y + h 
1 = e * r3_x + f * r3_x * r3_y + g * r3_y + h 
1 = e * r4_x + f * r4_x * r4_y + g * r4_y + h 

Vous pouvez résoudre ce comme bon vous semble le mieux. (Si vous connaissez la notation matricielle , il s'agit de deux équations matricielles pour lesquelles la matrice est la même, puis vous devez simplement trouver la décomposition LU une fois et résoudre les deux vecteurs inconnus). Les coefficients sont ensuite appliqués pour mapper l'intérieur du rectangle à la position dans le rectangle .


Le problème est, je input_x et input_y aswell comme r1, r2, r3, r4, mais je ne suis pas sûr de savoir comment atteindre output_x et output_y. Comment puis-je résoudre une telle équation? Je ne connais que la résolution d'équations avec 2 variables.

Merci

Répondre

5

C'est une explication terrible que vous avez trouvée. J'espère pouvoir vous aider à comprendre ce qui se passe sous le capot.

Ce que vous voulez faire est de mapper une zone rectangulaire (un quadrilatère) dans un autre quadrilatère (de forme arbitraire). Commençons par un cas simple: interpolation linéaire (trouver des valeurs qui se situent le long d'une ligne )

Si vous avez une ligne de a à b, vous pouvez trouver le point « c » sur cette ligne en utilisant cette équation :

c = ((1 - p) * a) + (p * b); 

Ce « mix » (interpole) les valeurs des deux positions le long de la ligne droite entre eux (linéaire). Si vous utilisez p = 0, l'équation se transforme en

c = (1 * a) + (0 * b) = a 

donc à p = 0 l'équation vous donne le point 'a'.

Lorsque p = 1, l'équation devient:

c = (0 * a) + (1 * b) = b 

donc à la p = 1, l'équation vous donne le point 'b'.

Aux valeurs intermédiaires de p, vous obtenez des points sur la ligne entre a et b. Donc, pour p = 0.5 vous obtenez le point exactement à mi-chemin entre a et b)

Donc, pour copier les pixels d'une ligne sur l'écran à une autre ligne sur l'écran, nous pouvons utiliser l'interpolation linéaire pour trouver les positions sur les lignes à lire et à écrire.

for (float p = 0.0; p <= 1.0; p += 0.1) // copy 10 pixels from line 1 to line 2 
    DrawPixelOnLine2(p, GetPixelFromLine1(p)); 

Ces deux méthodes pourraient simplement utiliser une interpolation linéaire pour calculer les positions correctes à lire et à dessiner les pixels, comme ceci:

int ax = 0, ay = 100, bx = 50, by = 170; // line a-b goes from (0,100) to (50,170) 

int px = ((1-p) * ax) + (p * bx);   // calc the x and y values separately 
int py = ((1-p) * ay) + (p * by); 

(Notez que je dois utiliser deux fois le calcul à faire Position 2D: je pourrais interpoler en 3D en ajoutant simplement le même calcul agaian pour les coordonnées az/bz/pz)

Donc, maintenant vous pouvez copier des points d'une droite arbitraire à l'autre.

interpolation bilinéaire est exactement le même, sauf que nous voulons trouver un point dans un rectangle plutôt que dans une ligne, donc nous avons besoin de deux dimensions pour décrire où le point est dans le rectangle (px le long du fond du rectangle, et py place le côté du rectangle). Vous pouvez maintenant localiser n'importe quel point dans le rectangle avec une paire de coordonnées (px, py). Pour effectuer le mappage ci-dessus, nous effectuons simplement le calcul d'interpolation linéaire en deux dimensions: d'abord, nous interpolons en bas et en haut pour trouver deux extrémités d'une ligne passant verticalement au milieu du rectangle. alors nous interpolons le long de cette ligne verticale pour trouver le dernier point au milieu du rectangle.

Le "rectangle" n'a pas besoin d'être rectangulaire. Les deux dimensions peuvent être utilisées sur n'importe quelle forme à quatre côtés (vous pouvez déplacer les coins de votre rectangle où vous voulez et les équations trouveront toujours les positions entre les coins pour remplir la zone entourée par la forme)

Dans l'exemple que vous avez trouvé, l'auteur utilise quatre points pour décrire la forme source (a, b, c, d) et quatre autres pour décrire la forme de la destination (e, f, g, h)

In De plus, ils ont rendu les calculs plus efficaces en résolvant les équations pour remplir une matrice de transformation qui peut être multipliée par rapport aux points pour effectuer le processus de cartographie. Cependant, l'effet est le même que ce que j'ai décrit ci-dessus. J'espère que mon explication vous aidera un peu plus à «voir» ce que font les équations.

0

Si vous voulez mapper un rectangle à un autre, vous aurez besoin d'une simple transformation linéaire. Pour mapper le point r au point q, vous avez:

qx = arx + bry + c 
qy = drx + ery + f

Il y a 6 variables, vous aurez besoin de 6 équations (3 points). Pour la carte rectangle r rectangle q:

q1x = a*r1x + b*r1y + c 
q1y = d*r1x + e*r1y + f 
q2x = a*r2x + b*r2y + c 
q2y = d*r2x + e*r2y + f 
q3x = a*r3x + b*r3y + c 
q3y = d*r3x + e*r3y + f

De là-haut, vous devez résoudre 2 systèmes de 3 équations linéaires avec 3 variables chacun. Ils auront exactement 1 solution tant que les points sont différents et non colinéaires (dans le cas des coins rectangle cela est rempli).

Questions connexes