如何使用SimpleITK按Slice Location逆序排序DICOM图像?
在SimpleITK中反转CT DICOM切片顺序(获取数组前实现)
当然可以在获取图像数组前完成切片顺序反转,这里提供两种直接基于SimpleITK的方法,都不需要先转成numpy数组:
方法1:反转文件名列表再加载
ImageSeriesReader.GetGDCMSeriesFileNames()返回的是按Slice Location升序排列的文件名列表,你只需要在设置给reader前反转这个列表,就能让切片按逆序加载:
import SimpleITK as sitk dir_name = "Directory of the Folder that contains individual DICOM slices" reader = sitk.ImageSeriesReader() filenames = reader.GetGDCMSeriesFileNames(dir_name) # 反转文件名列表 filenames = filenames[::-1] # 也可以用 filenames.reverse() 原地反转 reader.SetFileNames(filenames) reader.MetaDataDictionaryArrayUpdateOn() image_import = reader.Execute() # 后续转数组就是逆序切片 image_array = sitk.GetArrayFromImage(image_import)
注意:这种方法加载后的图像,空间原点会对应原序列最后一个切片的位置,z轴方向也会与原图像相反。如果后续操作需要严格保持空间坐标一致性(比如配准),可能需要手动调整图像的方向和原点参数。
方法2:用SimpleITK的Flip操作翻转切片维度
加载完成后,使用sitk.Flip()函数直接翻转切片所在的维度(通常是第三维,对应z轴方向),这种方法会自动适配空间元数据,更适合后续配准场景:
import SimpleITK as sitk dir_name = "Directory of the Folder that contains individual DICOM slices" reader = sitk.ImageSeriesReader() filenames = reader.GetGDCMSeriesFileNames(dir_name) reader.SetFileNames(filenames) reader.MetaDataDictionaryArrayUpdateOn() image_import = reader.Execute() # 翻转第三维(切片维度),参数为各维度是否翻转的布尔列表 # SimpleITK图像维度顺序为(x, y, z),因此z轴对应索引2 flipped_image = sitk.Flip(image_import, [False, False, True]) # 转数组即为逆序切片 image_array = sitk.GetArrayFromImage(flipped_image)
这种方法的优势在于,翻转后的图像空间坐标(原点、方向、间距)会自动调整,确保与图像内容匹配,对依赖空间信息的后续操作(如配准)更友好。
内容的提问来源于stack exchange,提问作者user24819415
相关产品推荐
相关产品推荐

