Проблема вращения MATLAB - PullRequest
       16

Проблема вращения MATLAB

2 голосов
/ 21 декабря 2010

Привет всем, мне нужны повернутые версии фантома 3D Шеппа Логана и соответствующая ему матрица вращения.Теперь вот что, я использую функцию phantom3d для создания 3D SLP, функция позволяет углам Эйлера определять вращение.Так, например:

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, это дает тот же результат, так что есть какое-то отношение к нему, но я не могу его найти.

У кого-нибудь есть идеи, предложения, помощь?

Большое спасибо

1 Ответ

1 голос
/ 22 декабря 2010

Проблема решена, по-видимому, вращение вокруг оси x отличается в этой функции.Обычно, когда вы вычисляете матрицу вращения для углов Эйлера, они утверждают:

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

C = [1 0 0 0 cos (тета) sin (тета) 0-син (theta) cos (тета)];

B = [cos (пси) 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)];

Если кто-то сталкивается с подобными проблемами, следуетвсегда наблюдайте за каждым вращением отдельно и изучайте отдельные матрицы вращения для углов Эйлера и Оси, потому что не каждая функция использует одну и ту же ось x, y, z или вращения стандартным образом.

В любом случае, спасибо запросмотр

...