0

この質問では、最初の次元が幅、2 番目の次元が高さ、3 番目の次元が x、y、z 座標を含む 3D マトリックスとして与えられた画像を回転させる必要があります。

現在、次のコードを使用してサーフェスをプロットしています

    Fig.sub1im=surf(ToFparam.ROI.XYZ(:,:,1),ToFparam.ROI.XYZ(:,:,2),ToFparam.ROI.XYZ(:,:,3),zeros(ToFparam.ROI.height,ToFparam.ROI.width,3));

これで、100x50x3 の 3 次元マトリックスができました。すべての x データは、3 次元の最初の...ページまたはレイヤーにあり、y は 2 番目のレイヤーです...z は 3 番目のレイヤーです。ここで、xy および z データに 3x3 回転行列を適用する必要があります。これを行うためにマトリックスを再形成する方法を知っています....それを3行×50000列のマトリックスに入れてから、マトリックスを適用します。

次に、プロットをループで更新する必要があります。次に、新しい行列計算も含めて、次のことを行うつもりでした。

ToFparam.ROI.XYZ_Vector = ToFparam.ROI.XYZ;
ToFparam.ROI.XYZ_Vector = reshape(ToFparam.ROI.XYZ, [size(ToFparam.ROI.XYZ,1)*size(ToFparam.ROI.XYZ,2),3]);
ToFparam.ROI.XYZ_Vector = ToFparam.ROI.XYZ_Vector';
ToFparam.ROI.XYZ_DICOM = inv(DICOMparam.calib.navi2dicom(1:3,1:3))*inv(Naviparam.data.Endo_RefHomMat(1:3,1:3))*ToFparam.ROI.XYZ_Vector;

%refresh plot standard cuts
set(Fig.sub1im,'CData', Color);
set(Fig.sub1im, 'XData', ToFparam.ROI.XYZ_DICOM(1,:) + DICOMPos(1)/Fig.sub2samp);
set(Fig.sub1im, 'YData', ToFparam.ROI.XYZ_DICOM(2,:) + DICOMPos(2)/Fig.sub2samp);
set(Fig.sub1im, 'ZData', ToFparam.ROI.XYZ_DICOM(3,:) + DICOMPos(3)/Fig.sub2samp);

プロットを更新すると、エラーは発生しませんが、正しくプロットされているようには見えません。私のデータに大きなオフセットがあり、配置したくない場所に配置されているようです。回転行列がスケーリングに影響を与えるとは思いませんが、方向だけです。このサーフ プロットを達成するためのより高速な/より良い方法があれば教えてください。ありがとう!

4

1 に答える 1

-1

興味のある人のために、私は解決策を見つけました。

x、y、z データが 3 次元に配置されている 3 次元行列を回転させたい場合は、最大の速度と効率のために次を使用します。

    [m,n,z]=size(inMatrix);
outMatrix=reshape((A*(reshape(double(inMatrix),[m*n 3]))')',[m n 3]);

inMatrix は初期 3D マトリックス、outMatrix は出力 3D マトリックス、A は回転マトリックスです。画像は幅と高さに沿って 2 つの次元を持ち、3 番目の次元は x、y、z 座標になるため、画像の回転をコーディングする場合に非常に便利です。これにより、最初のデータセットを簡単にプロットし、回転させてから再プロットすることができます。

于 2013-07-26T06:56:37.600 に答える