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

Posted

技术标签:

【中文标题】是否可以直接将仿射变换矩阵应用于 Mayavi ImageActor 对象?【英文标题】:Is it possible to directly apply an affine transformation matrix to a Mayavi ImageActor object? 【发布时间】:2013-06-28 17:17:53 【问题描述】:

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

二维图像数据数组,我使用mayavi.mlab.imshow 显示 一组 ROI,由我分别使用 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

现在剧情是这样的:

一切都排列得很好,但很难解释,因为平面在 z 方向上的间隔非常密集。我现在想做的是通过一些比例因子“拉伸”z轴。在点和线的情况下,这很容易做到——我所做的就是将所有转换后的 z 坐标乘以一个比例因子。

但是,我不知道如何对图像应用相同的转换。如果我只是缩放z位置,图像的旋转和缩放当然是错误的,我绘制的点/线将不再与图像落在同一平面上:

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

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

【问题讨论】:

我不认为这对我有用。这听起来很可怕,但我可以想象可能设置一个投影矩阵,使一个图像看起来好像已经过适当的仿射变换。但是,我需要在一个场景中渲染几张图像,每张图像都需要应用不同的转换。 【参考方案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),因此您应该能够根据需要在该矩阵上设置元素。

【讨论】:

以上是关于是否可以直接将仿射变换矩阵应用于 Mayavi ImageActor 对象?的主要内容,如果未能解决你的问题,请参考以下文章

由正交矩阵构建的仿射变换矩阵求逆的快速算法

由正交矩阵构建的仿射变换矩阵求逆的快速算法

OpenCV从仿射矩阵得到旋转量平移量缩放量

OpenCV从仿射矩阵得到旋转量平移量缩放量

OpenGL基础仿射变换原理解析

iOS:仅将仿射变换应用于子视图