Проблема ротации Matlab
-
12-10-2019 - |
Вопрос
Эй, все, мне нужны вращающиеся версии 3D Shepp Logan Phantom и это соответствующая матрица вращения. Теперь вот в чем дело, я использую функцию, называемую Phantom3D для создания 3D SLP, функция позволяет Euler Egles указывать вращение. Так, например:
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);
Теперь, согласно литературе, вы можете рассчитать матрицу вращения, используя:
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
Однако, если я сравниваю изображение, которое я создаю, используя Phantom3D с функцией, которая применяет матрицу вращения на не обработанном изображении, они не вращаются так же. Код для просмотра вращающейся версии этого изображения:
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);
Так что мне действительно нужно, чтобы IMG & IMG2 были одинаковыми, но это не так. Я нашел какой -то случай, когда я установил PSI, PHI & THETA на 45, а затем добавляю 180 к PHI при создании IMG2, он дает тот же результат, так что есть какое -то отношение к этому, но я не могу найти его.
У кого -нибудь есть идеи, предложения, помощь?
Большое спасибо
Решение
Проблема решена, по -видимому, вращение по оси x отличается в этой функции. Обычно, когда вы рассчитываете матрицу вращения для углов Euler, они утверждают, что это так:
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;
Однако в моем случае C был другим, а именно вращение по старой оси Y:
C = [cos (theta) 0 -sin (theta) 0 1 0 sin (theta) 0 cos (theta)];
Если кто -то сталкивается с одинаковыми проблемами, следует всегда наблюдать за каждому вращению отдельно и изучать отдельные матрицы вращения, для углов Euler и оси, потому что не каждая функция использует одинаковую ось x, y, z или строительные вращения стандартным способом.
В любом случае спасибо за просмотр