我正在使用Mayavi渲染一些由 3D 体积内的多个 2D 平面组成的成像数据,其位置、方向和比例由 4x4 刚体仿射变换矩阵定义。每架飞机包括:
- 二维图像数据数组,我使用
mayavi.mlab.imshow
- 一组 ROI,由我分别使用
mayavi.mlab.points3d
和绘制的线和点组成mayavi.mlab.plot3d
。
我将我的点和线顶点从 2D 参考平面转换为 3D 空间,方法是用我的仿射矩阵点它们的坐标。根据我之前的问题/答案,我发现我可以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 仿射矩阵?