ras转为lps坐标系

在医学图像处理(如 NIfTI 格式)中,RAS (Right, Anterior, Superior) 和 LPS (Left, Posterior, Superior) 是最常用的两种世界坐标系。

  • RAS :NIfTI 格式官方推荐存储坐标系的物理方向(NIfTI 的 qform / sform 通常编码为 RAS)。
  • LPS:DICOM 标准以及很多临床软件(如 ITK-SNAP、3D Slicer 内部默认、Eclipse 等)默认使用 LPS 坐标系。

将 RAS 转换为 LPS 非常简单,核心原理是:X 轴和 Y 轴方向翻转,Z 轴保持不变

复制代码
import numpy as np
import nibabel as nib

# 1. 定义 RAS 到 LPS 的变换矩阵
M_ras_to_lps = np.diag([-1, -1, 1, 1])

# 2. 转换单个坐标点
point_ras = np.array([10.5, -20.0, 30.2, 1.0]) # [x, y, z, 1]
point_lps = M_ras_to_lps @ point_ras
print(f"RAS 坐标: {point_ras[:3]} -> LPS 坐标: {point_lps[:3]}")
# 输出应该是 [-10.5, 20.0, 30.2]

# 3. 转换 NIfTI 图像的 Affine 矩阵
# 假设 img 是你的 NIfTI 图像对象
# img = nib.load('brain.nii.gz')
# affine_ras = img.affine  # nibabel 默认读取出来的就是 RAS 的 affine

# 模拟一个 RAS affine 矩阵用于演示
affine_ras = np.array([
    [1.5, 0.0, 0.0, -100.0],  # X 方向缩放 1.5 (R)
    [0.0, 1.5, 0.0, -120.0],  # Y 方向缩放 1.5 (A)
    [0.0, 0.0, 2.0,  -80.0],  # Z 方向缩放 2.0 (S)
    [0.0, 0.0, 0.0,    1.0]
])

# 左乘变换矩阵,得到 LPS 下的 affine
affine_lps = M_ras_to_lps @ affine_ras

print("\n原始 RAS Affine 矩阵:")
print(affine_ras)
print("\n转换后的 LPS Affine 矩阵:")
print(affine_lps)

注意:(ITK) 或 Python (SimpleITK) 环境下:

  1. ITK 内部默认使用 LPS 坐标系

  2. 当你用 SimpleITK 读取一个 NIfTI 文件时,SimpleITK 会自动将 NIfTI 内部的 RAS Affine 矩阵转换为 LPS。

  3. 因此,如果你在 nibabel (RAS) 和 SimpleITK (LPS) 之间传递坐标或 Affine 矩阵,必须执行上述的 X,YX,Y 翻转操作,否则配准或分割结果会出现左右、前后颠倒。

  4. 使用 nibabel 读 NIfTInibabel 的设计哲学是:无论 NIfTI 文件底层存的是什么,img.affine 一律返回 RAS 坐标系下的矩阵nibabel 会在底层自动帮你处理 qform/sform 的转换。

    复制代码
     import nibabel as nib
     img = nib.load('brain.nii.gz')
     affine = img.affine # 拿到的绝对是 RAS!

5.使用 SimpleITK 读 NIfTI/DICOMSimpleITK (基于 ITK) 的设计哲学是:一律使用 LPS 坐标系。它读取图像后,内部的方向矩阵自动转换为 LPS。

复制代码
    import SimpleITK as sitk
    img = sitk.ReadImage('brain.nii.gz')
    direction = img.GetDirection() # 拿到的是 LPS 方向!

根据affine判断是lps还是ras:

推断原理:体素增长方向与物理方向

在医学图像中,体素索引 (i,j,k)(i,j,k) 通常是按照特定的解剖学方向存储的:

  • ii 轴:通常从左到右
  • jj 轴:通常从后到前
  • kk 轴:通常从下到上

Affine 矩阵的前三列代表体素三个轴在世界坐标系中的方向向量和缩放比例 。我们主要看 3×33×3 子矩阵的主对角线元素的符号。

假设是 RAS 坐标系(+X=Right, +Y=Anterior, +Z=Superior):
  • ii 从左向右增加 →→ 指向 Right →→ 与 +X 方向一致 →→ 对角线第 1 个元素为
  • jj 从后向前增加 →→ 指向 Anterior →→ 与 +Y 方向一致 →→ 对角线第 2 个元素为
  • kk 从下向上增加 →→ 指向 Superior →→ 与 +Z 方向一致 →→ 对角线第 3 个元素为
    结论:一个典型 RAS 矩阵的主对角线通常是 [+, +, +]
假设是 LPS 坐标系(+X=Left, +Y=Posterior, +Z=Superior):
  • ii 从左向右增加 →→ 指向 Right →→ 与 +X(Left) 方向相反 →→ 对角线第 1 个元素为
  • jj 从后向前增加 →→ 指向 Anterior →→ 与 +Y(Posterior) 方向相反 →→ 对角线第 2 个元素为
  • kk 从下向上增加 →→ 指向 Superior →→ 与 +Z(Superior) 方向一致 →→ 对角线第 3 个元素为
    结论:一个典型 LPS 矩阵的主对角线通常是 [-, -, +]
相关推荐
sltin1 天前
需求到落地:我如何在微信小程序里实现证件照换底、隐私打码与水印相机
数码相机·微信小程序·小程序
恒锐丰小瑞2 天前
率能SS6810H 32V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式,用于POS打印机/安防相机/机器人
嵌入式硬件·数码相机·机器人·硬件工程
恒锐丰小瑞2 天前
率能SS6812T 40V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式(eTSSOP28),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
格林威2 天前
C#图像像素放大:邻域平均、双线性插值实现像素放大的C#实现代码
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
AI的探索之旅2 天前
图像格式与转换一文讲透:相机 / OpenCV / Qt
数码相机·qt·opencv
恒锐丰小瑞2 天前
率能SS6811H 38V/1.6A/双通道H桥驱动芯片,PWM控制接口与低功耗睡眠模式,用于舞台灯光/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
赵药师2 天前
RGBD相机测尺寸Python以及原理详解
数码相机
阿瑞斯官方账号3 天前
多台 CIS 拼接检测现场售后实录:条纹、暗带、拼接错位怎么处理
数码相机·计算机视觉·视觉检测
电化学仪器白超3 天前
MV-CS200-10UC相机参数配置
python·单片机·嵌入式硬件·数码相机·自动化·ltspice