Le calcul de la traduction de la valeur et de l'angle de rotation d'une rotation de l'image 2D
J'ai deux images dont l'une d'elles est l'image d'Origine et le second est l'image Transformée.
Je dois trouver combien de degrés l'image Transformée a été tourné à l'aide de 3x3 matrice de transformation. De Plus, j'ai besoin de savoir dans quelle mesure traduit de l'origine.
Les deux images sont grayscaled et tenue dans la matrice des variables. Leurs tailles sont les mêmes [350 500]
.
J'ai trouvé quelques notes de cours comme cette.
Notes de cours, je devrais utiliser la matrice suivante de la formule pour la rotation:
Pour la traduction de la matrice de la formule est:
Tout est bon. Mais il y a deux problèmes:
- Je ne pouvais pas imaginer comment mettre en œuvre des formules à l'aide de MATLAB.
- Les formules sont en forme pour trouver
x'
,y'
valeurs, mais j'ai déjà eux
,x'
,y
,y'
valeurs. J'ai besoin de trouver l'angle de rotation (thêta) ett
x
ett
y
. - Je veux savoir le equivailence de
x
,x'
,y
,y'
dans la matrice.
J'ai le code suivant:
rotationMatrix = [ cos(theta) sin(theta) 0 ; ...
-sin(theta) cos(theta) 0 ; ...
0 0 1];
translationMatrix = [ 1 0 tx; ...
0 1 ty; ...
0 0 1];
Mais comme vous pouvez le voir, tx, ty, thêta les variables ne sont pas définies avant d'être utilisé. Comment puis-je calculer theta
, t
x
et t
y
?
PS: Il est interdit d'utiliser la boîte à outils de Traitement d'Image fonctions.
OriginalL'auteur zkanoca | 2014-05-12
Vous devez vous connecter pour publier un commentaire.
C'est essentiellement une homographie de récupération problème. Ce que vous faites est donnée des coordonnées dans une image et les coordonnées dans l'autre image, que vous essayez de récupérer le combiné de la traduction et de la matrice de rotation qui a été utilisé pour emballer les points d'une image à l'autre.
Vous pouvez combiner la rotation et la translation dans une seule matrice par la multiplication de deux matrices ensemble. Multipliant est tout simplement la composition les deux opérations simultanément. Vous serait-il:
L'idée derrière cela est de trouver les paramètres en minimisant l'erreur par la méthode des moindres carrés entre chaque paire de points.
Fondamentalement, ce que vous voulez trouver est la relation suivante:
H
est le combiné de rotation et de translation de la matrice nécessaire à la carte les coordonnées de la une image à l'autre.H
est aussi une matrice 3 x 3, et sachant que la partie inférieure droite de l'entrée (ligne 3, colonne 3) est de 1, il rend les choses plus faciles. Aussi, en supposant que vos points sont augmentés système de coordonnées, nous avons essentiellement veux trouver cette relation pour chaque paire de coordonnées à partir de la première image(x_i, y_i)
à l'autre(x_i', y_i')
:L'échelle de
p_i
est de rendre compte de l'homographie de mise à l'échelle et de point de fuite. Nous allons effectuer une matrice-vecteur de multiplication de cette équation. Nous ne pouvons ignorer le 3ème élément, tel qu'il n'est pas utile pour nous (pour l'instant):Maintenant, nous allons jeter un oeil à la 3ème élément. Nous savons que
p_i = h31*x_i + h32*y_i + 1
. En tant que tel, en remplaçantp_i
dans chacune des équations, et en réarrangeant à résoudre pourx_i'
ety_i'
, on obtient ainsi:Ce que vous avez ici maintenant sont deux équations pour chaque paire de points. Ce que nous pouvons faire maintenant est de construire un système déterminé d'équations. Prendre chaque paire et la construction de deux équations. Vous aurez ensuite le mettre en forme de matrice, c'est à dire:
A
serait une matrice de coefficients qui ont été construits à partir de chaque ensemble d'équations à l'aide de coordonnées à partir de la première image,b
serait chaque paire de points pour la deuxième image eth
serait les paramètres que vous cherchez. En fin de compte, vous êtes enfin la résolution de ce système linéaire d'équations reformulé sous forme de matrice:Vous permettrait de résoudre pour le vecteur
h
qui peut être réalisée par la méthode des moindres carrés. Dans MATLAB, vous pouvez le faire via:Une note pour vous: Si le mouvement entre les images est vraiment juste une rotation et une translation, puis h31 et h32 seront tous deux à zéro après, nous avons à résoudre pour les paramètres. Cependant, j'aime toujours être approfondie et donc je vais résoudre pour h31 et h32 de toute façon.
NB: Cette méthode ne fonctionnera que si vous avez au moins 4 unique paires de points. Parce qu'il y a 8 paramètres à régler pour, et il y a 2 équations par point,
A
doit avoir au moins le rang de 8 pour que le système soit cohérent (si vous voulez jeter un peu d'algèbre linéaire de la terminologie utilisée dans la boucle). Vous ne serez pas en mesure de résoudre ce problème si vous avez moins de 4 points.Si vous voulez un peu de code MATLAB, supposons que vos points sont stockés dans
sourcePoints
ettargetPoints
.sourcePoints
sont à partir de la première image ettargetPoints
sont pour la deuxième image. De toute évidence, il devrait y avoir le même nombre de points entre les deux images. Il est supposé que les deuxsourcePoints
ettargetPoints
sont stockés en tant queM x 2
matrices. Les premières colonnes contiennent votrex
coordonne tandis que la seconde colonnes contiennent votrey
coordonnées.Une fois que vous avez terminé, vous avez un combiné de rotation et de translation de la matrice. Si vous voulez le
x
ety
traductions, il suffit de ramasser la colonne 3, lignes 1 et 2 enhmatrix
. Cependant, nous pouvons aussi travailler avec le vecteur deh
lui-même, et donc h13 serait l'élément 3, et h23 serait l'élément le numéro 6. Si vous voulez l'angle de rotation, il suffit de prendre les mesures trigonométriques inverses en fonction des lignes 1, 2 et colonnes 1, 2. Pour leh
vecteur, ce serait éléments 1, 2, 4 et 5. Il y aura un peu d'incohérence en fonction des éléments que vous choisissez comme cela a été résolu par la méthode des moindres carrés. Une manière d'obtenir un bon angle global serait peut-être de trouver les angles de tous les 4 éléments, puis faire une sorte de moyenne. De toute façon, c'est un bon point de départ.Références
J'ai appris à propos de l'homographie il y a un moment par Leow Wee Kheng du cours de Vision par Ordinateur. Ce que je vous dis est basé sur ses diapositives: http://www.comp.nus.edu.sg/~cs4243/de cours/de la caméra.pdf. Jetez un oeil à des diapositives 30-32 si vous voulez savoir d'où j'ai tiré ce matériau de. Toutefois, le code MATLAB j'ai écrit moi-même 🙂
h = A \ b;
exécuter, j'obtiens l'erreur : "Erreur à l'aide de \ algèbre Linéaire n'est pas pris en charge pour les types de données entier. Pour calculer elementwise LDIVIDE, utilisez LDIVIDE (.) au lieu de cela. Erreur dans la rotation (ligne 46) h = A \ b; "Jeter vos données à
double
avant de commencer le traitement. Je ne savais pas vos points ont été de type entier. J'ai changé mon code. Vérifier les modifications.BTW, j'ai aussi supposé que vos points sont stockés en tant que
M x 2
matrices. Les premières colonnes sont vosx
valeurs, et votre deuxième colonnes sont vosy
valeurs. Édité mon post de nouveau pour tenir compte de cela.merci beaucoup pour votre collobration. Là où je suis coincé à l'est de la conversion et de la mise en œuvre des notations mathématiques de ces structures de la matrice en code MATLAB. J'ai deux images en niveaux de gris sous la forme de plusieurs matrices nommé comme l'Originale et la Transformer. Supposons que j'ai une formule
F = m * a;
je saisF
, je saisa
. Je dois trouverm
. Toutes les sources dites-moi à trouverF
mais j'ai besoin de trouverm
. J'espère que je pourrais dire à mon problème avec mon pauvre anglais.Le code que j'ai écrit essentiellement résout pour
m
. Je ne suis pas sûr où vous êtes confus. Si vous prenez le code MATLAB j'ai écrit exactement, et la condition de laM x 2
matrices dont j'ai parlé, vous devriez être en mesure de récupérer la matrice de transformation à travers des moindres carrésOriginalL'auteur rayryeng