如何旋转 3D 阵列?
Posted
技术标签:
【中文标题】如何旋转 3D 阵列?【英文标题】:How can I rotate a 3D array? 【发布时间】:2011-06-13 12:20:47 【问题描述】:目前,如果我想比较狗的每个爪子下的压力,我只比较每个脚趾下的压力。但我想尝试比较整个爪子下方的压力。
但要这样做,我必须旋转它们,所以脚趾重叠(更好)。因为大多数时候左右爪子是稍微向外旋转的,所以如果不能简单地将一只放在另一只上面。因此,我想旋转爪子,所以它们都以相同的方式对齐。
目前,我通过查找两个中间脚趾和后面的一个using the toe detection 来计算旋转角度,然后我计算黄线(脚趾绿色和红色之间的轴)和绿线(中性)之间的角度轴)。
现在我要旋转阵列,将围绕后脚趾旋转,这样黄线和绿线对齐。但是我该怎么做呢?
请注意,虽然此图像只是 2D(仅每个传感器的最大值),但我想在 3D 阵列(平均 10x10x50)上计算它。我的角度计算的另一个缺点是它对脚趾检测非常敏感,所以如果有人有一个更数学上正确的计算建议,我会全神贯注。
I have seen one study with pressure measurements on humans,他们用的是局部几何惯性轴的方法,至少是非常可靠的。但这仍然不能帮助我解释如何旋转数组!
如果有人觉得有必要进行实验,这里有一个带有all the sliced arrays that contain the pressure data of each paw 的文件。澄清一下:walk_sliced_data 是一个字典,其中包含 ['ser_3', 'ser_2', 'sel_1', 'sel_2', 'ser_1', 'sel_3'],它们是测量的名称。每个测量值都包含另一个字典 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10](来自“sel_1”的示例),表示提取的影响。
【问题讨论】:
【参考方案1】:你为什么要那样做?为什么不简单地整合整个区域并进行比较?在这种情况下,您将获得力的大小,并且您可以简单地比较标量,这会容易得多。
如果您需要以某种方式比较区域(因此这就是您需要对齐它们的原因),那么可以尝试进行特征提取和对齐。但是,如果压力图不相似,这似乎会失败(比如有人没有在一只脚上等待太多)。
我想你可以变得非常复杂,但听起来你想要简单地计算力?
顺便说一句,如果图像相似,您可以使用简单的相关性测试来找到最佳角度和平移。
为此,您只需计算两个不同图像之间的相关性以进行各种平移和旋转。
【讨论】:
我喜欢您关于尝试关联图像以使它们全部对齐的建议,但这并不能解释我如何旋转图像。此外,如果您查看at my question regarding sorting the paws,您会发现我需要旋转爪子以使它们正确标准化。因为目前种群中的巨大差异使得很难对旋转方式与训练集中不同的爪子进行分类 你的爪子是“图像”。你像任何其他图像一样旋转它们。如果您的图像由 f(x,y) 给出,那么您的旋转图像为 f(xcos(t) - ysin(t), ycos(t) + x i>sin(t))。这种方法的唯一问题是它在离散函数上效果不佳,因为存在混叠。我相信您可以找到一些代码或库来旋转图像(二维数组)。这是很常见的事情。如果你想围绕一个点旋转,你首先平移图像,旋转,然后平移回来。 我真的不确定您是否从中获得了 3D 数组。我所看到的只是假设对应于压力图的密度图。数学上是一个函数 P(x,y),它是一个 2D 函数。如果您真的需要旋转 3D 阵列,那么您可以旋转 3 个角度。本质上是函数 P(x,y,z)。您可以从任何游戏编程站点找到矩阵变换。在这种情况下,您必须翻译每个点。本质上,矩阵中的点 (x,y,z) 变为 (x',y',z') 并且 (x',y',z') 来自矩阵旋转 siggraph.org/education/materials/HyperGraph/modeling/mod_tran/… 我只是展示了 3D 数组的一部分,因为它展示了数据的样子。但通常爪子与地面接触大约 50 帧,所以我会有一个 13、10、50 形状的阵列,我想比较压力分布随时间的变化。因此,我会以相同的方式旋转每一帧。虽然您可能知道要使用哪个库,但这并不意味着我知道,我只是一个试图弄清楚事情的人类运动科学家 :-) 但我感谢您的意见!【参考方案2】:使用Python Imaging Library,您可以旋转数组,例如:
array(Image.fromarray(<data>).rotate(<angle>, resample=Image.BICUBIC))
从那里,您可以在 3D 数组的不同层上创建一个 for 循环。
如果您将第一个维度作为图层,那么array[<layer>]
将返回一个二维图层,因此:
for x in range(<amount of layers>):
layer = <array>[i]
<array>[i] = (Image.fromarray(layer).rotate(<angle>, resample=Image.BICUBIC))
@IvoFlipse 的结果,a conversation 建议:
将阵列放入更大的阵列中以弥补较暗的背景。 考虑重新采样,也许先缩放数组。 将后脚趾移向中间可以让您绕着它旋转。 可以通过找到边界并将其重新定位在 15x15 中来确定较小的图像。【讨论】:
我认为您的解决方案几乎是正确的。除了将后脚趾移到中心之外,它所需要的只是使黄线(角度)也以后脚趾为基础。因此,在给出的示例中,图像应向左旋转(逆时针)。使工作空间更大并重新裁剪会产生 Ivo 想要的东西,据我了解,这是对后脚趾指向南方的爪子特征的特写。以上是关于如何旋转 3D 阵列?的主要内容,如果未能解决你的问题,请参考以下文章