Bonjour,
Je travaille actuellement sur un projet sous matlab dans lequel je cherche a appliquer une certaine rotation a un volume 3D binaire.
La nature de cette rotation doit dépendre de la forme de mon nuage de point dans cette image binaire.
En effet, plutôt que d'indiquer une rotation (alpha, beta, gamma) autour des axes (x,y,z) de mon image, je souhaite indiquer une rotation (alpha, beta, gamma) autour des 3 axes principaux du nuage de point et déterminer la rotation équivalente à exprimer dans le repère standard de l'image.
Pour donner un exemple. J'ai un patatoïde binaire, je détermine ses axes principaux, je calcule la matrice de rotation que je souhaiterais lui appliquer dans sa base, je calcule ensuite la matrice de rotation équivalente dans le repère (x,y,z) de l'image et je l'utilise dans ma fonction de rotation à appliquer sur l'image entière.
Voici les actions que j'ai effectuées pour cela :
1/ Centrer et normaliser mon nuage de points
2/ Calculer la matrice de corrélation
3/ Extraire les valeurs et vecteurs propres de cette matrice (obtention de la nouvelle base)
4/ Générer la matrice de rotation (alpha, beta, gamma) Mrot
5/ Générer la matrice de rotation équivalente dans la base (x,y,z) de mon image. Pour cela je multiplie Mrot par la matrice des valeurs propre et la matrice inverse des vecteurs propres (changement de base)
6/ J'applique la rotation sur mon image avec cette nouvelle matrice de rotation
Mes questions sont les suivantes :
- Cette démarche vous semble-t-elle correcte ? Si non, pourriez-vous m'éclairer sur ce qui ne va pas ?
- Je ne pense pas avoir pris en compte le centrage et la normalisation de mon nuage de points dans mon retour à la base xyz. Si c'est le cas, comment (et quand !) dois-je rétablir cela ?
- Avec ce que je viens de faire, je n'obtiens pas de bons résultats. Ma matrice de rotation finale a des coefficient quasi nuls et me fait du coup obtenir une image vide. J'en déduis que je ne calcule pas correctement ma nouvelle matrice de rotation. Qu'est ce qui cloche ?
Voici un exemple de résultat avec un nuage de points auquel je souhaite appliquer une rotation de 90 degrés autour de chacun de ses 3 axes principaux
Matrice de corrélations =
0.0007 -0.0001 -0.0003
-0.0001 0.0013 -0.0005
-0.0003 -0.0005 0.0008
eigenVectors =
0.6348 0.7707 0.0547
0.3939 -0.3838 0.8352
0.6647 -0.5087 -0.5472
eigenValues =
0.0002 0 0
0 0.0009 0
0 0 0.0016
rotationMatrix =
0.0000 1.0000 0.0000 0
1.0000 0.0000 -0.0000 0
-0.0000 0.0000 -1.0000 0
0 0 0 1.0000
rotationMatrix2 =
0.0004 -0.0004 0.0008 0
0.0001 0.0002 0.0000 0
-0.0011 0.0008 0.0009 0
0 0 0 1.0000
Avec :
rotationMatrix2 = rotationMatrix(1:3,1:3) * eigenValues * inv(eigenVectors);
rotationMatrix2 = [rotationMatrix2 [0;0;0] ; 0 0 0 1 ]
Merci d'avance pour votre aide !
Cordialement,
Pierre