使用GDCMSeriesFileNames或路径列表读取的DICOM图像

2024-09-29 19:31:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我用SimpleITK来分析动态PET数据。我有一个文件夹,里面有148*N张图片(N是动态宠物的帧数),我想把每一帧的图片分开。 首先,我用相应的图像为每个帧创建一个子文件夹。在

>folder #Folder of dynamic data
   >subfolder1 #Subfolder with images of Frame 1
      >image1, image2, ..., image148
   >subfolder2 #Subfolder with images of Frame 2
      >image149 image 150, ..., image296

我在读我的图像如下:

^{pr2}$

创建所有这些子文件夹不是很好用,所以我尝试将图像的所有路径存储在列表中:

frame1 = [image1, ..., image148]
frame2 = [image149, ..., image296]
...
frame_list = [frame1, frame2, ..., frameN]

像这样阅读图像:

image = sitk.ReadImage(frame_list[0])

问题是,当我观察位于相同坐标(x,y,z)的体素值时,这两种方法得到的值不一样。 似乎使用series_reader.GDCMSeriesFileNames()SimpleITK可以检索到一些关于DICOM图像的信息,比如原始图像。在

SimpleITK检索哪些信息来创建带有series_reader.GDCMSeriesFileNames()的图像,我需要有完全相同的图像?或者有没有其他方法可以使用路径列表来获得相同的图像?在

注:在本文中,所有以“image”命名的变量都是指向图像的路径,而不是SimpleITK图像对象。在

编辑:在我的例子中,我所有的帧都有相同的序列号,所以我不能使用series_reader.GDCMSeriesFileNames(path_folder, series_ID)


Tags: of图像image路径文件夹with图片动态
3条回答

据我所知,你有一个文件夹,里面有所有的Dicom切片,你想把它们作为一个单独的体积来读取,这样你就可以在任何给定的坐标上访问体素值。 尝试通过以下代码片段读取Dicom图像:

reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(path_subfolder1)
reader.SetFileNames(dicom_names)
image = reader.Execute()

现在,image是包含path_subfolder1中所有切片的3D卷,您可以访问体素值、间距、方向、原点等

我希望这能有所帮助,如果不能随意在下面发表评论。在

不需要将该系列分成单独的目录。您可以使用itk::simple::ImageSeriesReader::GetGDCMSeriesIDs方法获取目录中seriesID的列表。在

您可以使用以下一行代码轻松创建seriesID到文件列表的映射: series_dic = { series_id: reader.GetGDCMSeriesFileNames(path, series_id) for series_id in reader.GetGDCMSeriesIDs(path) }

通过使用GetGDCMSeriesFileNames方法,您应该获得所有文件按其物理位置排序的正确顺序,而使用手动方法则不是这样。在

如果此自动方法不适用于您的特定扫描仪或采集过程,则必须手动加载DICOMS字典,按序列号分隔,然后根据采集的适当DICOM标记对其进行正确排序。在

我找到的临时解决方案是:

1)使用sitk.ImageFileReader()创建包含每个切片作为图像对象的列表:

frame1 = [Image1, ..., Image148]
frame2 = [Image149, ..., Image296]
...
frame_list = [frame1, frame2, ..., frameN]

在这里,我们不处理第一个图像

2)修改DICOM标题中的每个图像seriesID:

^{pr2}$

3)使用writer = sitk.ImageFileWriter()writer.KeepOriginalImageUIDOn()将带有新seriesID的图像写入缓冲文件夹

4)使用@blowekamp方法将所有不同的序列号与相关图像路径存储在字典中:

series_dic = { series_id: reader.GetGDCMSeriesFileNames(path, series_id) for series_id in reader.GetGDCMSeriesIDs(path) }

5)阅读系列并将其存储在列表中:

for keys in series_dic:
  Img_list.append(sitk.ReadImage(series_dic[keys]))

6)最后我用shutil.rmtree(path, ignore_errors=True)删除缓冲文件夹

这不是很优化,因为我必须写新的图像然后删除它。如果你有更好的答案,请随时评论!在

相关问题 更多 >

    热门问题