NIfTI 文件格式 中,qform
和 sform
是两种不同的方式,用于存储 像素坐标到物理空间坐标的仿射变换矩阵。它们的作用是定义图像数据在真实世界(例如 MRI 扫描仪坐标系)中的位置、方向和缩放。
1. qform
(基于四元数的变换)
特点
- 更紧凑的表示:使用 四元数(quaternion) 表示旋转,节省存储空间。
- 兼容性更好:所有 NIfTI 阅读工具都支持
qform
。 - 适用于刚体变换(旋转 + 平移 + 均匀缩放)。
存储方式
qform
的变换矩阵由以下头文件字段组成:
quatern_b
,quatern_c
,quatern_d
→ 旋转的四元数表示qoffset_x
,qoffset_y
,qoffset_z
→ 平移(物理空间原点)pixdim[1..3]
→ 像素间距(缩放)
2. sform
(直接存储仿射矩阵)
特点
- 更灵活:直接存储 4×4 仿射矩阵,支持任意线性变换(如剪切、非均匀缩放)。
- 精度更高:避免四元数转换带来的数值误差。
- 适用于复杂变换(如 DICOM 到 NIfTI 的转换)。
存储方式
sform
的变换矩阵直接存储在以下头文件字段:
srow_x
→ 矩阵第 1 行[a b c d]
srow_y
→ 矩阵第 2 行[e f g h]
srow_z
→ 矩阵第 3 行[i j k l]
sform_code
→ 标识变换类型(见下表)
sform_code | 含义 |
---|---|
0 | 未指定(忽略 sform ) |
1 | Scanner-based 坐标(原始 MRI 坐标系) |
2 | Aligned 坐标(标准空间,如 MNI) |
3 | Talairach 坐标(人脑模板) |
4 | 其他模板坐标 |
3 总结
qform
:紧凑的四元数表示,兼容性好,适合刚体变换。sform
:直接存储仿射矩阵,灵活精确,适合复杂变换。- 大多数情况下,库(如 SimpleITK/nibabel)会自动处理两者,无需手动干预。
4 使用
从 NIfTI 头文件提取参数
import nibabel as nib
img = nib.load("your_image.nii")
header = img.header
# 获取关键参数
origin = header.get_qform()[:3, 3] # 或 header.get_sform()[:3, 3]
spacing = header.get_zooms()[:3] # 像素间距 (dx, dy, dz)
direction = header.get_qform()[:3, :3] # 方向矩阵
构建仿射矩阵
affine = np.eye(4)
affine[:3, :3] = direction * spacing # 旋转 + 缩放
affine[:3, 3] = origin # 平移
坐标转换
world_coord = affine @ np.append([10, 20, 30], 1)