54

我正在使用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 仿射矩阵?

4

1 回答 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)

给我们以下...

随机图像

创建一个变换矩阵并设置一个术语来给它一些剪切......

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

给我们 ...

带有剪切的随机图像

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

于 2021-06-01T02:04:41.503 回答