0

这个问题需要旋转作为 3D 矩阵给出的图像,其中第一维是宽度,第二维是高度,第三维包含 x,y,z 坐标。

目前我正在使用以下代码绘制表面

    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-D 矩阵。所有 x 数据都在第 3 维的第一页或层中,y 是第二层...z 第三层。现在我需要对 xy 和 z 数据应用 3x3 旋转矩阵。我知道如何重塑矩阵来做到这一点,我认为....只需将其放入 3 行 x...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-D 矩阵,请使用以下方法以获得最大速度和效率。

    [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 回答