将点或形状旋转到新轴



我用Python编写了一些代码,使用Scikit-Image regionprops函数返回的矩参数将椭球体拟合为3D数据。基本上我所做的就是从regionprops中得到"惯性张量",我把它提供给numpy 8来得到特征向量和特征值。这些特征向量是正交的单位向量,它们描述了与我的数据相匹配的椭球的长轴和短轴(我认为)。我从Matlab的regionprops3函数中借鉴了这个想法——我的线性代数课是在十多年前上的,我记得的很少。

使用从skimage regionprops返回的数据,我可以得到椭球体的方程。我的问题是,这个椭球体的长轴和短轴与xyz轴对齐,而不是描述真正椭球体的向量。我需要旋转椭球体,使长轴与第一个特征向量(而不是x轴)对齐,小轴旋转到第二个和第三个特征向量(而不是y和z轴)。

一张图片应该能让你明白我在说什么左图是待拟合的原始数据,右图是未适当旋转的拟合椭圆。我假设通过查看原始数据,椭球体应该更垂直地对齐,可能向后(更高的y)。

我已经纠结了几天了,但是我对矩阵代数和几何的理解还不足以让我明白我在这里需要做什么。我想我可以用单位向量做椭球体的点积但这行不通。有旋转矩阵,欧拉角,四元数,万向节锁等。对于一个(看似)简单的问题,这些似乎都是极其复杂的解决方案。我见过一些使用"奇异值分解"的解决方案,但我不知道那是什么。

基于一些阅读,我认为我要做的是所谓的"轴变换的主动旋转",但我只是不能弄清楚。

非常感谢你的帮助!

它实际上就是一个点积。我的问题是,我在xyz绘图,但scikit图像返回向量在zxy。另一个问题是,我的z-spacing是xy的11倍,所以它只需要一些额外的步骤。

旋转数组是我在我的问题中描述的:

[[eig1x, eig2x, eig3x]

[81y, 82y, 83y]

[eig1z, eig2y, eig3z]]

然后用

转换所有数据new_point = np。点(rotation_matrix old_point)

最新更新