仅给出一个切片的标签,您必须使用SliceThickness
作为第三个维度,尽管我建议不要这样做,因为这不能保证给出切片之间的距离。有标签SpacingBetweenSlices
提供了此信息,尽管它似乎不存在于您的案例中。
最好的方法是利用差异ImagePositionPatient
相邻切片之间。为此,您当然还需要下一个切片的标签。附注:在您的列表中,ImageOrientation
and ImagePosition
应该更好地阅读ImageOrientationPatient
and ImagePositionPatient
, as ImageOrientation
and ImagePosition
是其他标签(CT 图像中不存在)。
ImagePositionPatient
给出 DICOM 患者坐标中切片左上角的位置,要计算距离,您必须考虑切片在该坐标系中的方向。这是由下式给出的ImageOrientationPatient
,其中包含 DICOM 坐标中切片的归一化行和列方向余弦向量。您可以在DICOM标准.
方向矩阵的前两个分量由下式提供ImageOrientationPatient
(例如第一个和第二个三个数字),第三个分量可以通过这两个分量的叉积来计算。
因此,在伪代码中,这看起来像这样:
orient1 = vector(ImageOrientationPatient[0], ImageOrientationPatient[1], ImageOrientationPatient[2])
orient2 = vector(ImageOrientationPatient[3], ImageOrientationPatient[4], ImageOrientationPatient[5])
orient3 = orient1 x orient2 // cross product
orient_matrix = matrix(orient1, orient2, orient3)
pos1 = vector(ImagePositionPatient[0], ImagePositionPatient[1], ImagePositionPatient[2]) // from current slice
pos2 = vector(ImagePositionPatient[0], ImagePositionPatient[1], ImagePositionPatient[2]) // from adjacent slice
diff_pos = pos2 - pos1
image_pos = orient_matrix o diff_pos / length(orient3) // normalized dot product
voxel_z = image_pos.z
Update:正如@gofal 所指出的,第一个版本是不正确的。我还包括标准化(例如删除length(orient3)
),尽管严格来说这些值应该已经标准化。