SimpleITK 对与Dicom 文件的矩阵的插值_想做无忧无虑的咸鱼的博客-CSDN博客
最近在做毕业设计,然后涉及到了Dicom文件的3D矩阵处理。
这个矩阵是一个512 * 512 * 203 的矩阵,voxel spacing 是 0.895375 * 0.895375 * 2.49997,要插值成spacing是0.5 * 0.5 * 0.5
的一个3D矩阵。
首先我试了Matlab 里面的插值函数 interp3,以及griddate,但是往往在meshgride这个函数就会跑死,要不就是Memory Error
(我的电脑是联想拯救者Y7000,这个跑不了的话大佬可以试试台式机)。所以这里不得不说处理一类问题的时候最好还是找到对应的数据库。所以我们不得不看一下Simple ITK这个库。
1 读取一个文件。
import SimpleITK as sitkfile_path = 'E:\data'reader = sitk.ImageSeriesReader()series_IDs = sitk.ImageSeriesReader.GetGDCMSeriesIDs(file_path) # 查看该文件夹下的序列数量nb_series = len(series_IDs)print(nb_series)#生产图像对应的labelseries_file_names = sitk.ImageSeriesReader.GetGDCMSeriesFileNames(file_path, series_IDs[0])reader.SetFileNames(series_file_names)image = reader.Execute()
我这里要打开的是由多个dicom构成的一个三维的矩阵。那首先我要打开一个空的变量。就是sitk.ImageSeriesReader()这时候并没有与数据关联起来。其次我们通过GetGDCMSeriesIDs()得到在文件夹data下的所有的Dicom文件的文件名称。再通过SetFilename 可以将架构里面的文件的选项填上,通过Execute就得到了你的dicom对应的image
2 做插值
做插值就是要定义一个filter,这个之前网上定义的也有,但是不知道为什么没有数据。于是我找了一些资料。写了如下的filter
#设置一个Filterresample = sitk.ResampleImageFilter()#设置插值方式(1)resample.SetInterpolator(sitk.sitkLinear)#默认像素值(2)resample.SetDefaultPixelValue( 0 );#沿着x,y,z,的spacing(3)#The sampling grid of the output space is specified with the spacing along each dimension and the origin.newspacing = [0.5,0.5,0.5]resample.SetOutputSpacing(newspacing)#设置original(4)resample.SetOutputOrigin(image.GetOrigin())#设置方向(5)resample.SetOutputDirection(image.GetDirection())#有几个值(6)size = [880,880,1014]#注意你这个设置的是Filter,有了original,spacing,number,就应该是新的吧#经试验确实size是改变pixel value的当 【1000,1000,1000】时value是0.618怎么算到的?#原来的是 512 * 512 * 203 之前的voxle spacing 是 0.859375 * 0.859375 * 2.49997# 1000 10000 1000 这个是总的要求的属# 所以这个应该是之前的 不是算得的resample.SetSize(size)#设置输入的数据 ??#设置transform#transform = sitk.Euler3DTransform()#resample.SetTransform( transform )resample.SetDefaultPixelValue(0)new = resample.Execute(image)print(new.GetSize())data = sitk.GetArrayFromImage(new)
3 保存,为了方便可以将文件保存为nii格式的,打开的软件推荐ITK-SNAP
sitk.WriteImage(new,'./new.nii')
赞 (0)