是否可以直接将仿射变换矩阵应用于Mayavi ImageActor对象?

时间:2013-07-01 14:31:38

标签: python transformation mayavi

我正在使用Mayavi渲染一些由3D体积内的多个2D平面组成的成像数据,其位置,方向和比例由4x4刚体仿射变换矩阵定义。每个平面包括:

  • 我使用mayavi.mlab.imshow
  • 显示的2D图像数据数组
  • 由我分别使用mayavi.mlab.points3dmayavi.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

现在情节如下:

enter image description here

所有东西都很好地排列,但是很难解释,因为这些平面在z中的间距非常密集。我现在希望能够做的是通过一些比例因子“拉伸”z轴。在点和线的情况下,这很容易做到 - 我所做的就是将所有变换的z坐标乘以比例因子。

但是,我无法弄清楚如何将相同的变换应用于图像。如果我只是缩放z位置,图像的旋转和缩放当然是错误的,我的绘制点/线将不再与图像位于同一平面上:

enter image description here

我需要做的是应用非刚性仿射变换,该变换将剪切以及旋转,平移和缩放结合到我的图像中。

有什么方法可以手动将剪切应用到ImageActor,或者甚至更好地直接应用我预先计算的任意4x4仿射矩阵?

1 个答案:

答案 0 :(得分:1)

ImageActor 最终是 tvtk.ImageActor 的包装器,具有 user_matrix 属性,可让您分配 4D 变换矩阵。

从随机图像开始,

    import numpy as np
    from mayavi.mlab import imshow
    s = np.random.random((10, 10))
    image = imshow(s, colormap='gist_earth', interpolate=False)

给我们以下...

Random image

创建一个变换矩阵并设置一个项以使其具有一定的剪切力...

    from tvtk.api import tvtk
    transform_matrix = tvtk.Matrix4x4()
    transform_matrix.set_element(0, 1, 2.5)
    image.actor.user_matrix = transform_matrix

给我们...

Random image with shear

set_element 具有签名 (row, col, value),因此您应该能够根据需要在该矩阵上设置元素。