Domanda

Ciao a tutti, ho bisogno di versioni ruotate di un fantasma 3D Shepp Logan e sta corrispondente matrice di rotazione. Ora qui è la cosa, io uso una funzione chiamata phantom3d per creare la SLP 3D, la funzione permette angoli di Eulero di specificare una rotazione. Così, per esempio:

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

Ora secondo la letteratura è possibile calcolare una matrice di rotazione utilizzando:

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  

Tuttavia, se confronto dell'immagine Creo usando l'phantom3d con una funzione che applica la matrice di rotazione su un'immagine non ruotata, essi non ruotano nello stesso modo. Il codice per visualizzare il ruotata versionof questa immagine è:

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

Quindi, in realtà ho bisogno di avere img & img2 essere lo stesso, ma non è. Ho trovato alcuni casi in cui ho psi set, phi e theta a 45 e quindi aggiungere 180 a phi durante la creazione img2 dà lo stesso risultato, quindi c'è qualche relazione ad esso, ma io non riesco a trovarlo.

Qualcuno ha qualche idea, suggerimenti, aiuto?

Thx un sacco

È stato utile?

Soluzione

Problema risolto, apparentemente la rotazione sull'asse x è diverso in questa funzione. Normalmente quando u calcolare la matrice di rotazione per angoli di Eulero affermano che sia:

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

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

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

R = B * C * D;

Tuttavia nel mio caso il C era diverso, cioè una rotazione sul vecchio asse y:

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

Se incontri qualcuno problemi simili, si deve sempre osservare ogni rotazione separatamente e studiare le matrici di rotazione separati, per euler e asse angoli, perché non ogni funzione utilizza il x stesso, y, asse z o fa le rotazioni nello standard spiegato modo.

Comunque grazie per la visualizzazione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top