Pregunta

Hola a todos, necesito versiones rotadas de un fantasma 3D shepp Logan y su correspondiente matriz de rotación. Ahora aquí está la cosa, yo utilizo una función llamada phantom3d para crear la SLP 3D, la función permite ángulos de Euler para especificar una rotación. Así, por ejemplo:

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);

Ahora bien, según la literatura se puede calcular utilizando una matriz de rotación:

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  

Sin embargo, si comparo la imagen i crear usando el phantom3d con una función que se aplica la matriz de rotación en una imagen no girada, no lo hacen girar en la misma manera. El código para ver el girado versiónde esta imagen es:

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);

Así que en realidad necesita tener img y img2 a ser el mismo, pero no lo es. He encontrado algún caso en el que psi conjunto, phi y theta a 45 y luego agregar 180 a phi al crear img2 da el mismo resultado, por lo que existe cierta relación con él, pero me parece que no puede encontrarlo.

Cualquier persona tiene ideas, sugerencias, ayuda?

Thx mucho

¿Fue útil?

Solución

Problema resuelto, al parecer la rotación sobre el eje x es diferente en esta función. Normalmente cuando u calcular la matriz de rotación de los ángulos de Euler afirman que fuera:

D = [cos (phi) sen (phi) 0 -sen (phi) cos (phi) 0 0 0 1];

C = [1 0 0 0 cos (theta) sen (theta) 0 -sen (theta) cos (theta)];

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

R = B * C * D;

Sin embargo, en mi caso la C era diferente, a saber, una rotación sobre el antiguo eje y:

C = [cos (theta) 0 -sen (theta) 0 1 0 sen (theta) 0 cos (theta)];

Si encuentros alguien problemas similares, siempre se debe observar cada rotación por separado y estudiar las matrices de rotación separados, por Euler y de eje ángulos, porque no todos los función utiliza el x misma, y, eje z o hace las rotaciones en el estándar explican camino.

De todos modos gracias por la visualización

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top