从3D阵列中提取任意旋转的数据平面作为2D阵列

时间:2012-01-31 16:43:02

标签: matlab 3d matrix rotation slice

我在matlab中有一个3D矩阵数据,但我想从该矩阵中提取一个任意旋转的数据切片并将其存储为我可以访问的2D矩阵。类似于slice()函数如何显示以任何角度切片的数据,除了我还希望能够像查看数组一样查看和修改数据。

我有平面枢轴点的坐标以及旋转角度(在x,y和z轴上),我还计算了以下形式的平面方程:

Ax + By + Cz = D

并且可以提取仅包含落在该平面上的数据的3D矩阵,但我不知道如何将其转换为简单的2D阵列。

另一种方法是以某种方式在与平面角度相反的方向上旋转源矩阵,以便将数据平面与XY轴对齐,并简单地提取矩阵的那部分,但我不知道是否可以旋转这样的矩阵。

我希望其他地方没有回答,我一整天都在谷歌上搜索,但这些问题似乎与我的完全不符。

由于

2 个答案:

答案 0 :(得分:1)

您可以查看the code here。我认为这个功能类似于你想要解决的问题。

function extracts an arbitrary plane from a volume给出平面的大小,平面的中心点和平面法线,即[A,B,C]。它还输出平面上每个像素的体积指数和坐标。

答案 1 :(得分:0)

啊哈!可能我自己就解决了。

要生成平面方程,我使用旋转矩阵旋转(0,0,1)的法向量,然后找到D.如果我还旋转以下向量:

(1,0,0) //step in the x direction of our 2D array

(0,1,0) //step in the y direction of our 2D array

我将使用渐变来表示在我步入阵列中的下一列或下一行之前,x,y,z中的坐标必须改变多少。

我会尽快嘲笑这个并将其标记为答案(如果有效)

编辑:好的略有改动,当我旋转我的矢量时,我还应该旋转3D空间中的点,表示x = 0,y = 0,z = 0的xyz坐标(虽然我在旋转结构的中心,所以它实际上是-sizex / 2,-sizey / 2,-sizez / 2,其中size是数据的大小,然后我只需在旋转后向每个坐标添加size / 2以将其转换回来它应该在哪里)。

现在我在3D中有渐变变化,因为我增加了我的2D数组的x坐标和渐变变化,因为我增加了y坐标,我可以简单地遍历所有可能的x和y坐标(结果数组将是对于50x50x50阵列,50x50,我不确定在我的2D阵列中对于不规则尺寸(我最终需要解决的)是什么,并在数据中计算我的平面上的最终3D坐标。我的旋转角点值作为起点。万岁!

刚开始对所有角度进行良好的测试,然后我会批准这个作为答案