【问题标题】:3D image alignment: How to extract rotation angles about "static" x,y,z axes from a 3x3 rotation matrix in matlab3D 图像对齐:如何从 matlab 中的 3x3 旋转矩阵中提取关于“静态”x、y、z 轴的旋转角度
【发布时间】: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)) .优化算法最终选择的几何变换输出到对象tformtform 包含一个 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

标签: matlab image-processing


【解决方案1】:

我认为this question 的答案应该可以帮助您:将 3D 旋转分解为笛卡尔分量。

【讨论】:

    【解决方案2】:

    如果我理解正确,您所需要的只是rotm2axang,它将作为正交旋转矩阵rotm 给出的旋转转换为相应的轴角表示axang。输入旋转矩阵必须是旋转的预乘形式。

    rot2axang 的输出是一个 n 轴角度旋转的 n×4 矩阵。每行的前三个元素指定旋转轴,最后一个元素定义旋转角度(以弧度为单位)。

    如果您无法访问具有该功能的机器人系统工具箱,请考虑使用this alternative

    编辑:

    可以通过以下步骤将 3D 空间中的点围绕由两点 (x1,y1,z1)(x2,y2,z2) 之间的连线定义的任意轴旋转角度 alpha

    1. 平移使旋转轴通过原点
    2. 围绕 x 轴旋转,使旋转轴位于 ​​xz 平面内(或在 xz 平面上的投影)
    3. 绕 y 轴旋转,使旋转轴位于 ​​z 轴(或 z 轴上的投影)
    4. alpha 绕 z 轴旋转
    5. 步骤 3 的逆操作
    6. 步骤 2 的逆操作
    7. 步骤 1 的逆操作

    您是在询问步骤 2,3 中的角度吗?

    否则,您是否已经在您旋转的轴的原点?

    如果确实需要步骤 2,3 中的角度,那么:

    第 1 步是通过转换矩阵 T 完成的:

    T =  [ 1    0   0   -x1
          0     1   0   -y1
          0     0   1   -z1
          0     0   0   1  ];
    
        
    

    步骤 #2 通过以下方式完成: 假设v = (a,b,c) 是沿旋转轴的单位向量,则d = sqrt(b^2 + c^2) 是投影到yz 平面上的长度。然后旋转旋转轴在 yz 平面上的投影与由单位矢量v 的 z 分量与其 yz 投影的点积给出的 z 轴之间的角度。此角度 (beta) 由以下因素确定:cos(beta) = dot([0,0,c],[0,b,c]) /(c*d) = c/d , sin(beta) = cross( [0,0,c],[0,b,c]) /(c*d) = b/d

    因此旋转矩阵Rx为:

    Rx = [ 1    0     0     0
           0    c/d  -b/d   0
           0    b/d   c/d   0
           0    0     0     1 ] ;
    

    第 3 步我们绕 y 轴旋转,使旋转轴位于 ​​z 轴的正方向。使用点积和叉积关系,角度的余弦为d,角度的正弦为a。绕y轴Ry的旋转矩阵为

    Ry = [ d    0   -a  0
           0    1   0   0
           a    0   d   0
           0    0   0   1];
    

    最后,我们简单地围绕 z 旋转角度alpha

    Rz = [ cos(alpha)   sin(alpha)  0   0
          -sin(alpha)   cos(alpha)  0   0
           0            0           1   0
           0            0           0   1 ] ;
    

    【讨论】:

    • 这是我对rotm2axang 仅应用于一个 3x3 预乘旋转矩阵时的理解:我将生成一个 1x4 行向量。前三个分量(我将其称为 a、b、c)一起形成一个单位向量。这个单位向量代表旋转轴。然后,该 1x4 行向量中的第 4 个值表示围绕该单位向量旋转轴旋转的弧度数。因此,我的问题是“如何将围绕该单位旋转矢量轴的单个旋转分解为围绕参考图像坐标系的 x、y 和 z 轴的旋转”。
    • vrrotmat2vec 也这样做。但是,再一次,我对以下问题特别感兴趣:“如何将围绕该单位旋转矢量轴的单个旋转分解为围绕参考图像坐标系的 x、y 和 z 轴的旋转”跨度>
    • 此时这主要是一道数学题,所以我可能会转到stackexchange,但我不知道matlab是否提供了可以执行我感兴趣的操作的函数。
    • 但是如果不是该向量的前三个分量,这里的 x,y,z 轴是什么?如果您仅在 3D 中围绕某个任意旋转轴旋转一次,则这将在 x、y、z 轴上进行投影,该投影由根据某个原点定义的角度给出。我用一些问题编辑了我的答案,试图更好地理解你想要什么。另外,一个最小的例子在这里会很好。毕竟都是几何学和三角学,这里没有什么疯狂的事情。
    • 也许混淆源于我对rotm2axang 函数的理解(因为我真的不确定我是否在编辑中掌握了你的 cmets)。让rotm2axang 的输出由有序的四元组 (a,b,c,r) 定义。首先,sqrt(a^2+b^2+c^2) = 1。a是这个单位向量的x分量大小,b是这个单位向量的y分量大小,c是此单位向量的 z 分量。因此,这个单位向量被锚定在 (0,0,0)。 r 的值决定了组成刚体的每个点围绕单位向量表示的轴旋转了多少。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2016-04-06
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多