我用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)
据我所知,你有一个文件夹,里面有所有的Dicom切片,你想把它们作为一个单独的体积来读取,这样你就可以在任何给定的坐标上访问体素值。 尝试通过以下代码片段读取Dicom图像:
现在,
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()
创建包含每个切片作为图像对象的列表:在这里,我们不处理第一个图像
2)修改DICOM标题中的每个图像seriesID:
^{pr2}$3)使用
writer = sitk.ImageFileWriter()
和writer.KeepOriginalImageUIDOn()
将带有新seriesID的图像写入缓冲文件夹4)使用@blowekamp方法将所有不同的序列号与相关图像路径存储在字典中:
5)阅读系列并将其存储在列表中:
6)最后我用
shutil.rmtree(path, ignore_errors=True)
删除缓冲文件夹这不是很优化,因为我必须写新的图像然后删除它。如果你有更好的答案,请随时评论!在
相关问题 更多 >
编程相关推荐