【发布时间】:2021-04-14 16:56:26
【问题描述】:
我正在使用(作为概述)以下编码方案进行 3D 成像对齐:
ref = imref3d(size(img(:,:,:,1)),[0 32] ,[0 32] ,[0 20] );
[optimizer, metric] = imregconfig( 'monomodal');
tform=imregtform(img(:,:,:,2), ref, img(:,:,:,1), ref, 'rigid', optimizer, metric);
transform_mat=tform.T
为澄清起见,变量 img 是 3D 图像的时间序列(其中每个 3D 图像是 2D 横截面的堆栈)。在不同的时间点,我正在成像的对象可以移动。因此,上述代码的目的是生成几何变换,以最佳方式将 3D 体积的第二个时间点 (img(:,:,:,2)) 与参考图像对齐,参考图像是 3D 体积的第一个时间点 (img(:,:,:,1)) .优化算法最终选择的几何变换输出到对象tform。 tform 包含一个 4x4 矩阵作为其属性之一 (T);正是这个 4x4 矩阵对平移和旋转信息进行了编码。从上面的代码可以看出,我将这个 4x4 矩阵存储在变量 transform_mat 中。
在阅读了大量零散的 mathworks 文档后,我确定这个 transform_mat 变量(表示仿射刚体变换矩阵)位于“后乘" 形式,据我了解,它只是表示它是传统上线性代数教科书中所见内容的转置版本。
出于我的目的,我有兴趣从transform_mat 中提取特定的轮换信息。这是我到目前为止所做的:
rot_postmultiply=transform_mat(1:3,1:3); %extracting the elements that encode rotation-related info
rot_premultiply=rot_postmultply'; %transposing
为了快速插入,我创建了旋转矩阵的预乘版本,因为我相信作用于旋转矩阵的许多函数都假定它处于其预乘形式。
从这个 3x3 旋转矩阵中,我想提取旋转(以弧度为单位)关于参考图像的静态 x 轴、y 轴和 z 轴强>。我最初的尝试如下:
eul = rotm2eul(rot_premultiply);
rotm2eul 函数为我提供了与这个 3x3 旋转矩阵相关的 3 个欧拉角。 eul 是一个 1x3 向量,根据文档,“欧拉角旋转的默认顺序是 'ZYX'”。但是,我不确定 欧拉角 是否真的描述了我想要提取的信息(即关于参考图像的静态 x、y、z 轴的旋转)。
我没有很强的线性代数/几何变换背景,但我对欧拉角的理解是,每次发生的旋转都会改变坐标系。例如,在围绕 Z 轴(eul 向量中的第一个值)旋转之后,我们现在有了新 X 和 Y 轴(称为 X' 和 Y')。那么“Y 轴旋转”(eul 中的第二个值)实际上是围绕 Y' 的旋转...不是 Y。对最终的“X 旋转”重复此参数(即真的会是关于 X'' 轴)。
如果有人能提供一些关于如何进行的见解(如果我对欧拉角的担忧是正确的),我将不胜感激!
另外,如果“static”这个词是不正确的术语,我们深表歉意。希望我提供了足够的上下文,以免引起混淆。
【问题讨论】:
-
那你为什么不使用
rotm2axang?