2

こんにちは、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 に設定し、img2 を作成するときに phi に 180 を追加すると、同じ結果が得られるケースがいくつか見つかりました。そのため、いくつかの関係がありますが、それを見つけることができないようです。

誰にもアイデア、提案、助けがありますか?

ありがとう

4

1 に答える 1

1

問題は解決しました。明らかに、この関数ではx軸上の回転が異なります。通常、uがオイラー角の回転行列を計算すると、次のように記述されます。

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

誰かが同様の問題に遭遇した場合、すべての関数が同じx、y、z軸を使用したり、標準の説明された方法で回転を行ったりするわけではないため、常に各回転を個別に観察し、オイラーと軸の角度について個別の回転行列を調べる必要があります。

とにかく見てくれてありがとう

于 2010-12-22T10:21:02.183 に答える