Question

Salut à tous, j'ai besoin versions d'un fantôme ayant subi une rotation logan Shepp 3D et il est la matrice de rotation correspondant. Maintenant, voici la chose, j'utilise une fonction appelée phantom3d pour créer le SLP 3D, la fonction permet de spécifier des angles euler une rotation. Ainsi, par exemple:

phi = 45;
theta = 45;
psi = 45;

%just a matrix of inputs to create the shepp logan phantom
e =[  1  .6900  .920  .810      0       0       0      0+phi      0+theta      0+psi
    -.8  .6624  .874  .780      0  -.0184       0      0+phi      0+theta      0+psi
    -.2  .1100  .310  .220    .22       0       0    -18+phi      0+theta     10+psi
    -.2  .1600  .410  .280   -.22       0       0     18+phi      0+theta     10+psi
     .1  .2100  .250  .410      0     .35    -.15      0+phi      0+theta      0+psi
     .1  .0460  .046  .050      0      .1     .25      0+phi      0+theta      0+psi
     .1  .0460  .046  .050      0     -.1     .25      0+phi      0+theta      0+psi
     .1  .0460  .023  .050   -.08   -.605       0      0+phi      0+theta      0+psi
     .1  .0230  .023  .020      0   -.606       0      0+phi      0+theta      0+psi
     .1  .0230  .046  .020    .06   -.605       0      0+phi      0+theta      0+psi   ];

img = phantom3d(e, 50);

selon la littérature, vous pouvez calculer une matrice de rotation à l'aide:

phi = ((phi + 180)/180).*pi;
theta = (theta/180).*pi;
psi = (psi/180).*pi;

cphi = cos(phi);
sphi = sin(phi);
ctheta = cos(theta);
stheta = sin(theta);
cpsi = cos(psi);
spsi = sin(psi);

% Euler rotation matrix
alpha = [cpsi*cphi-ctheta*sphi*spsi   cpsi*sphi+ctheta*cphi*spsi  spsi*stheta;
        -spsi*cphi-ctheta*sphi*cpsi  -spsi*sphi+ctheta*cphi*cpsi cpsi*stheta;
        stheta*sphi  

Cependant, si je compare l'image que je crée en utilisant la phantom3d avec une fonction qui applique la matrice de rotation sur une image non pivotée, ils ne tournent pas de la même manière. Le code pour afficher la rotation versionde cette image est:

img = phantom3d(50);
szout = size(img);
Cf = eye(4);
Cf(1:3, 4) = -szout/2;
Co = Cf;
%previously created alpha
alpha(4,4) = 1;
%Cf & Co are used for translations
Rmatrix = inv(Cf) * alpha * Co;
[x, y, z]=ndgrid(single(1:szout(1)), single(1:szout(2)), single(1:szout(3)));
xyz = [x(:) y(:) z(:) ones(numel(x),1)]*Rmatrix(1:3,:)';
xyz = reshape(xyz,[szout 3]);
img2 = interpn(single(img), xyz(:,:,:,1),xyz(:,:,:,2),xyz(:,:,:,3), 'cubic', 0);

Alors je réellement besoin d'avoir img & img2 d'être le même, mais ce n'est pas. J'ai trouvé quelques cas où je psi ensemble, phi et thêta à 45, puis ajouter 180 à phi lors de la création img2 lui donne le même résultat, donc il y a une certaine relation avec elle, mais je ne peux pas sembler le trouver.

quelqu'un a des idées, des suggestions, aide?

Thx beaucoup

Était-ce utile?

La solution

Le problème est résolu, apparemment la rotation sur l'axe des x est différent dans cette fonction. Normalement, lorsque u calculer la matrice de rotation pour qu'ils angles de Euler indiquent qu'il soit:

D = [cos (phi) sin (phi) 0     sin (phi) cos (phi) 0     0 0 1];

C = [1 0 0     0 cos (theta) sin (thêta)     0 sin (thêta) cos (theta)];

B = [cos sin (psi) (psi) 0     sin cos (psi) (psi) 0     0 0 1];

R = B * C * D;

mais dans mon cas, le C était différent, à savoir une rotation sur l'ancien axe y:

C = [cos (theta) 0 sin (thêta)     0 1 0     sin (thêta) 0 cos (theta)];

Si quelqu'un rencontre des problèmes similaires, il faut toujours observer chaque rotation séparément et étudier les matrices de rotation séparées, pour euler et l'axe des angles, car non toutes les fonctions utilise le même x, y, axe z ou fait les rotations dans la norme expliqué manière.

En tout cas merci pour l'affichage

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top