我正在使用Mayavi渲染一些由3D体积内的多个2D平面组成的成像数据,其位置,方向和比例由4x4刚体仿射变换矩阵定义。每个平面包括:
mayavi.mlab.imshow
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仿射矩阵?
答案 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)
给我们以下...
创建一个变换矩阵并设置一个项以使其具有一定的剪切力...
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)
,因此您应该能够根据需要在该矩阵上设置元素。