如何旋转一个3D数组?

12 投票
2 回答
4479 浏览
提问于 2025-04-16 10:25

目前,如果我想比较狗狗每只爪子下面的压力,我只比较每个脚趾下面的压力。但我想尝试比较整个爪子下面的压力。

为了做到这一点,我需要旋转爪子,让脚趾更好地重叠。因为通常情况下,左右爪子会稍微向外旋转,所以不能简单地把一只爪子叠在另一只上面。因此,我想把爪子旋转到同样的方向。

alt text

现在,我通过查看中间的两个脚趾和后面的一个脚趾来计算旋转角度,使用脚趾检测,然后计算黄色线(绿色和红色脚趾之间的轴)和绿色线(中性轴)之间的角度。

现在我想围绕后脚趾旋转这个数组,使得黄色线和绿色线对齐。但我该怎么做呢?

需要注意的是,虽然这个图像只是二维的(仅显示每个传感器的最大值),我想在一个三维数组上进行计算(平均为10x10x50)。另外,我的角度计算有个缺点,就是对脚趾检测非常敏感,所以如果有人有更数学上正确的计算方法,我非常乐意听取。

我看到过一项关于人类压力测量的研究,他们使用了局部几何惯性轴的方法,这种方法至少是非常可靠的。但这仍然无法帮助我解释如何旋转这个数组!

alt text

如果有人想尝试一下,这里有一个文件,里面包含了每只爪子的压力数据的所有切片数组。为了澄清一下: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'的示例),这些代表提取的冲击数据。

2 个回答

3

你为什么要这样做呢?为什么不直接把整个区域整合起来比较呢?这样的话,你可以得到一个力的大小,然后直接比较这些数值,这样会简单很多。

如果你需要比较不同的区域(所以你需要对齐它们),那么可以尝试提取特征和对齐。不过,如果压力图不太相似的话(比如说,有人一只脚没怎么用力),这样的方法可能就不太管用了。

我想你可以让事情变得很复杂,但听起来你其实只是想计算力的大小,对吧?

顺便说一下,如果这些图像相似的话,你可以用一个简单的相关性测试来找到最佳的角度和位置。

要做到这一点,你只需要计算这两幅不同图像在不同位置和旋转下的相关性。

2

使用Python图像库,你可以通过以下方式来旋转一个数组:

array(Image.fromarray(<data>).rotate(<angle>, resample=Image.BICUBIC))

接下来,你可以对3D数组的不同层进行循环。

如果你的第一维是层,那么array[<layer>]会返回一个2D层,这样:

for x in range(<amount of layers>):
    layer = <array>[i]
    <array>[i] = (Image.fromarray(layer).rotate(<angle>, resample=Image.BICUBIC))

这是@IvoFlipse的结果,里面有一段对话建议:

  • 把这个数组放进一个更大的数组里,以解决背景变暗的问题。
  • 考虑重新采样,可能先缩放一下数组。
  • 把后面的脚趾移动到中间,这样你就可以围绕这个点旋转了。
  • 通过找到边界并把它们重新放置到15x15的大小,可以确定一个更小的图像。

alt text

alt text

撰写回答