我正在使用Mayavi渲染一些成像数据,其中包含3D体积内的多个2D平面,其位置、方向和比例由4x4刚体仿射变换矩阵定义。每个平面都包括:
- 一个2D图像数据数组,我使用
mayavi.mlab.imshow
显示。 - 一组ROIs,包括线和点,我使用
mayavi.mlab.points3d
和mayavi.mlab.plot3d
绘制它们。
我通过用仿射矩阵点乘它们的坐标将我的点和线顶点从2D参考平面转换为3D空间。基于我之前的问题/答案here,我发现我可以使用以下方式单独设置每个ImageActor
对象的位置和方向:
obj = mlab.imshow(img)
obj.actor.orientation = [pitch, roll, yaw] # the required orientation (deg)
obj.actor.position = [dx, dy, dz] # the required position
obj.actor.scale = [sx, sy, sz] # the required scale
现在情节看起来像这样:
所有东西都排列得很好,但由于飞机在z方向上密集分布,所以很难解释。现在我想做的是通过某个缩放因子“拉伸”z轴。对于点和线而言,这非常容易实现 - 我只需要将所有转换后的z坐标乘以一个缩放因子即可。
然而,我无法弄清楚如何将同样的变换应用于图像。如果我仅缩放z位置,则图像的旋转和缩放肯定会出错,并且我绘制的点/线不再落在与图像相同的平面上:
我需要做的是将切变、旋转、平移和缩放合并到图像中,形成一种非刚性仿射变换。
有没有办法手动将切变应用于ImageActor
,甚至更好的办法是直接应用我预先计算的任意4x4仿射矩阵?