方向余弦矩阵的度量空间?

计算科学 几何学
2021-12-12 09:39:34

我在医疗领域工作。有时我们会收到沿同一方向采集的 MR 图像,但是在查找方向余弦矩阵时,值略有不同(达到一定精度)。扫描仪仅存储矩阵的前 6 个值,后 3 个值是使用前 2 个向量的叉积计算的。这两个方向余弦定义了关于患者的第一行和第一列

什么是比较两个不同方向余弦矩阵的正确度量空间(相当于欧几里得距离?)?

典型例子:

import numpy as np
a1,b1=np.array([0.997704,0.0677201,6.10347E-5]),np.array([-0.0673549,0.992439,-0.102604])
a2,b2=np.array([0.997704,0.0677201,6.10347E-5]),np.array([-0.067355,0.992439,-0.102604])
a3,b3=np.array([0.997704,0.0677202,6.10347E-5]),np.array([-0.0673549,0.992439,-0.102604])

通过大量挥手,比较法线的点积可以了解方向余弦矩阵的接近程度:

>>> c1 = np.cross(a1,b1)
>>> c2 = np.cross(a2,b2)
>>> c3 = np.cross(a3,b3)
>>> np.dot(c1,c2)
0.9999987261098883
>>> np.dot(c2,c3)
0.9999987328817403
2个回答

我最终实施了@DanielShapero 的建议(或者至少我是如何理解的):

import numpy as np
def distance(a, b): # a & b contains each the first 6 values of direction cosine matrix
    ax, ay = a # ax is the first vector, ay is the second vector
    bx, by = b # bx is the first vector, by is the second vector
    az = np.cross(ax, ay) # ax × ay
    bz = np.cross(bx, by) # bx × by
    return np.arccos(np.dot(az, bz)) # d(x,y)=arccos(x⋅y)

使用我原来的例子:

a1, b1 = np.array([0.997704, 0.0677201, 6.10347E-5]), np.array([-0.0673549, 0.992439, -0.102604])
a2, b2 = np.array([0.997704, 0.0677201, 6.10347E-5]), np.array([-0.067355, 0.992439, -0.102604])
a3, b3 = np.array([0.997704, 0.0677202, 6.10347E-5]), np.array([-0.0673549, 0.992439, -0.102604])

也:

a4, b4 = np.array([1, 0, 0]), np.array([0, 1, 0])
a5, b5 = np.array([0, 1, 0]), np.array([0, 0, 1])
a6, b6 = np.array([0, 0, 1]), np.array([1, 0, 0])

我可以验证这给出了预期的结果:

print(distance((a1, b1), (a2, b2)))
print(distance((a2, b2), (a3, b3)))
print(distance((a3, b3), (a1, b1)))

0.0015961769213946786
0.00159192872155101
0.0015961542345642986

同样适用于:

print(distance((a4, b4), (a5, b5)))
print(distance((a5, b5), (a6, b6)))
print(distance((a6, b6), (a4, b4)))

1.5707963267948966
1.5707963267948966
1.5707963267948966

从技术上讲,基于 arctan 的表达式是唯一适用于所有角度的表达式。所以我最终没有arccos直接使用。

如果您有参考方向,我建议使用每个向量与参考向量的差异范数。由于向量已经归一化,这可以作为相对规范。另一种选择是计算您的方向与参考方向之间的角度。