【问题标题】:Extract arbitrarily rotated plane of data from 3D array as 2D array从 3D 数组中提取任意旋转的数据平面作为 2D 数组
【发布时间】:2012-01-31 16:43:01
【问题描述】:

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

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

Ax + By + Cz = D

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

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

我希望这个问题没有在其他地方得到解答,我整天都在谷歌上搜索,但似乎没有一个问题与我的完全匹配。

谢谢

【问题讨论】:

  • 您是否只需要完全在平面上的数据(通常是非常少量的数据点)还是做想要插入数据?
  • 我想返回最近的单元格而不是插值,虽然稍后会考虑插值
  • 要清楚,您有一个包含 3 个索引的矩阵 A[i,j,k]=a_ijk 并且您想要创建一个包含 2 个索引的数组 B[u,v]=b_uv 其中 u,v 是平面/切片上的坐标i,j,k 世界? (并且所有索引都是整数)另外,ijk 对应于u=1v=1 是否有一些约定?

标签: matlab 3d matrix rotation slice


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    啊哈!可能刚刚自己解决了。

    为了生成平面方程,我使用旋转矩阵旋转 (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 添加到旋转后的每个坐标即可将其转换回来到它应该在的地方)。

    现在,当我增加 2D 数组的 x 坐标和增加 y 坐标时,我有了 3D 的渐变变化,我可以简单地循环遍历所有可能的 x 和 y 坐标(生成的数组将是50x50 对于 50x50x50 数组,我不确定它对于不规则大小会是什么,我最终需要解决这个问题)在我的 2D 数组中,并在数据中计算我的平面上生成的 3D 坐标。我的旋转角值作为起点。万岁!

    只需为此制定一个涵盖所有角度的良好测试,然后我将批准此作为答案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多