SimpleITK.GetDirection()输出解释及与DICOM、NIFTI的关联问题
SimpleITK方向矩阵与DICOM、NIfTI关联及常见切面取值说明
1. SimpleITK.GetDirection()输出含义
GetDirection()返回的是一个3×3的方向余弦矩阵的行优先展平元组,作用是描述图像像素坐标到患者世界坐标系的映射关系:
- 矩阵的每一列对应图像的一个轴(x轴/行方向、y轴/列方向、z轴/层方向)在世界坐标系下的单位方向向量
- 矩阵为正交矩阵,行列式为±1,为负时代表图像存在镜像翻转
- SimpleITK默认使用LPS(左-后-上)作为世界坐标系:x轴正方向指向患者左侧、y轴正方向指向患者后侧、z轴正方向指向患者头侧
2. 与DICOM Image Orientation (Patient)字段的关联
DICOM标准中的Image Orientation (Patient)(以下简称IOP)字段为6个浮点数的序列,和SimpleITK方向矩阵完全兼容:
- IOP的前3个值 = 方向矩阵第一列的三个元素,对应图像行方向在LPS坐标系下的方向余弦
- IOP的后3个值 = 方向矩阵第二列的三个元素,对应图像列方向在LPS坐标系下的方向余弦
- DICOM单帧没有显式存储层方向,层方向由行方向向量和列方向向量叉乘计算得到,和SimpleITK方向矩阵的第三列完全一致
3. 与NIfTI格式的关联
NIfTI格式默认使用RAS(右-前-上)作为坐标系,和SimpleITK的LPS坐标系仅x、y轴符号相反:
- SimpleITK读取NIfTI文件时,会自动将NIfTI存储的RAS方向矩阵转换为LPS格式,再通过
GetDirection()返回 - SimpleITK写入NIfTI文件时,也会自动将内部的LPS方向矩阵转换为RAS格式存储,无需用户手动做坐标系转换
4. 标准无旋转切面对应的IOP取值
以下为临床常用的无倾斜、无翻转切面的标准IOP值,可直接使用:
- 轴位(Axial,横断位):
1\0\0\0\1\0
对应SimpleITK方向矩阵:(1, 0, 0, 0, 1, 0, 0, 0, 1) - 冠状位(Coronal,额状位):
1\0\0\0\0\1
对应SimpleITK方向矩阵:(1, 0, 0, 0, 0, 1, 0, -1, 0) - 矢状位(Sagittal,旁正中位):
0\1\0\0\0\1
对应SimpleITK方向矩阵:(0, 1, 0, 0, 0, 1, 1, 0, 0)
如果图像存在旋转、倾斜,可根据切面和LPS坐标系的夹角计算对应方向余弦即可。
5. DicomSeriesFromArray示例的设定逻辑
该示例的核心逻辑是:先给SimpleITK图像对象设置正确的方向矩阵,导出DICOM序列时,SimpleITK会自动从方向矩阵中提取前6个值写入IOP字段,无需手动赋值。如果你的输入数组是其他切面,只需要提前调用SetDirection()传入对应切面的方向矩阵即可,后续导出DICOM时IOP会自动匹配。
内容的提问来源于stack exchange,提问作者vpap
相关产品推荐
相关产品推荐

