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

54

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

  • 一个2D图像数据数组,我使用mayavi.mlab.imshow显示。
  • 一组ROIs,包括线和点,我使用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仿射矩阵?


我认为那对我来说行不通。听起来相当可怕,但我可以想象也许设置一个投影矩阵,使一个图像看起来像已经被适当的仿射变换。然而,我有几个需要在单个场景中呈现的图像,每个图像都需要应用不同的变换。 - ali_m
1个回答

2

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),因此您应该能够根据需要设置矩阵上的元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接