1、resampleSize
这个重采样不是重采样Spacing ,却是重采样size,为了达到所有的数据一致的size
例如:(880, 880, 12) 采样统一的(880,880,16)
因为假如3DUnet网络数据设置了输入格式为(N, C, 16, xxx,xxx), 可以把每个数据的size都重采样(16,xxx,xxx),然后输入网络。
如果直接设置Size 为(16,xxx,xxx),多余的层SimpleITK会用0来填充,达不到真正的采样。所以通过上面对Spacing采样进行反操作
1 """ 2 统一Size 3 X轴和Y轴的Size和Spacing没有变化, 4 Z轴的Size和Spacing有变化 5 """ 6 def resampleSize(sitkImage, depth): 7 #重采样函数 8 euler3d = sitk.Euler3DTransform() 9 10 xsize, ysize, zsize = sitkImage.GetSize() 11 xspacing, yspacing, zspacing = sitkImage.GetSpacing() 12 new_spacing_z = zspacing/(depth/float(zsize)) 13 14 origin = sitkImage.GetOrigin() 15 direction = sitkImage.GetDirection() 16 #根据新的spacing 计算新的size 17 newsize = (xsize,ysize,int(zsize*zspacing/new_spacing_z)) 18 newspace = (xspacing, yspacing, new_spacing_z) 19 sitkImage = sitk.Resample(sitkImage,newsize,euler3d,sitk.sitkNearestNeighbor,origin,newspace,direction) 20 return sitkImage 21 22 DEPTH = 16 #需要重采样Size的层数 23 24 #读取nifit原数据 ,size为:(880, 880, 12) 25 NifitmPath = 'work/data/nifit/Case14.nii.gz' 26 sitkImage = sitk.ReadImage(NifitmPath) 27 print("重采样前的信息") 28 print("尺寸:{}".format(sitkImage.GetSize())) 29 print("体素大小(x,y,z):{}".format(sitkImage.GetSpacing()) ) 30 31 print('='*30+'我是分割线'+'='*30) 32 33 34 newsitkImage = resampleSize(sitkImage, depth=DEPTH) 35 print("重采样后的信息") 36 print("尺寸:{}".format(newsitkImage.GetSize())) 37 print("体素大小(x,y,z):{}".format(newsitkImage.GetSpacing()) )
1 重采样前的信息 2 尺寸:(880, 880, 12) 3 体素大小(x,y,z):(0.3448275923728943, 0.3448275923728943, 5.499998092651367) 4 ==============================我是分割线============================== 5 重采样后的信息 6 尺寸:(880, 880, 16) 7 体素大小(x,y,z):(0.3448275923728943, 0.3448275923728943, 4.124998569488525)
2、CT图像预处理之重采样
按照指定spacing 重采样数据的缺点就是一般无法重采样到指定尺寸。实际应用中经常遇到需要指定尺寸图像的情况。
1 def Resampling(img,lable = False): 2 original_size = img.GetSize() #获取图像原始尺寸 3 original_spacing = img.GetSpacing() #获取图像原始分辨率 4 new_spacing = [1, 1, 1] #设置图像新的分辨率为1*1*1 5 6 new_size = [int(round(original_size[0] * (original_spacing[0] /1))), 7 int(round(original_size[1] * (original_spacing[1] / 1))), 8 int(round(original_size[2] * (original_spacing[2] / 1)))] #计算图像在新的分辨率下尺寸大小 9 resampleSliceFilter = sitk.ResampleImageFilter() #初始化 10 if lable == False: 11 Resampleimage = resampleSliceFilter.Execute(img, new_size, sitk.Transform(), sitk.sitkBSpline, 12 img.GetOrigin(), new_spacing, img.GetDirection(), 0, 13 img.GetPixelIDValue()) 14 ResampleimageArray = sitk.GetArrayFromImage(Resampleimage) 15 ResampleimageArray[ResampleimageArray < 0] = 0 #将图中小于0的元素置为0 16 else:# for label, should use sitk.sitkLinear to make sure the original and resampled label are the same!!! 17 Resampleimage = resampleSliceFilter.Execute(img, new_size, sitk.Transform(), sitk.sitkLinear, 18 img.GetOrigin(), new_spacing, img.GetDirection(), 0, 19 img.GetPixelIDValue()) 20 ResampleimageArray = sitk.GetArrayFromImage(Resampleimage)
3、SKIMAGE.TRANSFORM-两种缩放皆可
1 # 1、按目标大小缩放resize 2 skimage.transform.resize(image, output_shape, order=1, mode='reflect', cval=0, clip=True, preserve_range=False, anti_aliasing=True, anti_aliasing_sigma=None) 3 # 2、按缩放因子缩放rescale 4 skimage.transform.rescale(image, scale, order=1, mode='reflect', cval=0, clip=True, preserve_range=False, multichannel=False, anti_aliasing=True, anti_aliasing_sigma=None) 5 6 # The order of interpolation. The order has to be in the range 0-5: 7 # 0: Nearest-neighbor 8 # 1: Bi-linear (default) 9 # 2: Bi-quadratic 10 # 3: Bi-cubic 11 # 4: Bi-quartic 12 # 5: Bi-quintic
4、Python SimpleItk库的医学图像重采样(resample)实现代码
需求:已有配准好的CT以及PET图像,而金标准label是在CT上勾画的,因此有一些简单的需求,一种是把PET图像重采样到与CT图像一样的大小(比如从192×192×371到512×512×484),或者把金标准Mask降到同PET的大小(即反过来)。
怎么找的方法:ITK-SNAP(3.8版本)的读图功能是支持不同大小、spacing、origin、direction的图像一起展示的,软件会相当于resample后续加入的图像; 因此,已知ITK存在解决的方法了,剩下就是找对应代码。
1 import SimpleITK as sitk 2 3 def resize_image_itk(ori_img, target_img, resamplemethod=sitk.sitkNearestNeighbor): 4 """ 5 用itk方法将原始图像resample到与目标图像一致 6 :param ori_img: 原始需要对齐的itk图像 7 :param target_img: 要对齐的目标itk图像 8 :param resamplemethod: itk插值方法: sitk.sitkLinear-线性 sitk.sitkNearestNeighbor-最近邻 9 :return:img_res_itk: 重采样好的itk图像 10 使用示范: 11 import SimpleITK as sitk 12 target_img = sitk.ReadImage(target_img_file) 13 ori_img = sitk.ReadImage(ori_img_file) 14 img_r = resize_image_itk(ori_img, target_img, resamplemethod=sitk.sitkLinear) 15 """ 16 target_Size = target_img.GetSize() # 目标图像大小 [x,y,z] 17 target_Spacing = target_img.GetSpacing() # 目标的体素块尺寸 [x,y,z] 18 target_origin = target_img.GetOrigin() # 目标的起点 [x,y,z] 19 target_direction = target_img.GetDirection() # 目标的方向 [冠,矢,横]=[z,y,x] 20 21 # itk的方法进行resample 22 resampler = sitk.ResampleImageFilter() 23 resampler.SetReferenceImage(ori_img) # 需要重新采样的目标图像 24 # 设置目标图像的信息 25 resampler.SetSize(target_Size) # 目标图像大小 26 resampler.SetOutputOrigin(target_origin) 27 resampler.SetOutputDirection(target_direction) 28 resampler.SetOutputSpacing(target_Spacing) 29 # 根据需要重采样图像的情况设置不同的dype 30 if resamplemethod == sitk.sitkNearestNeighbor: 31 resampler.SetOutputPixelType(sitk.sitkUInt8) # 近邻插值用于mask的,保存uint8 32 else: 33 resampler.SetOutputPixelType(sitk.sitkFloat32) # 线性插值用于PET/CT/MRI之类的,保存float32 34 resampler.SetTransform(sitk.Transform(3, sitk.sitkIdentity)) 35 resampler.SetInterpolator(resamplemethod) 36 itk_img_resampled = resampler.Execute(ori_img) # 得到重新采样后的图像 37 return itk_img_resampled
5、使用SimpleITK对volume文件进行插值处理
在进行dicom文件分析时,往往会对其进行插值或者重采样处理,可以使用SimpleITK轻松完成。
1 import SimpleITK as sitk 2 3 def getDicomSeriesVolumeImage(folderPath): 4 ''' 5 读取dicom序列文件 6 :para folderPath:dicom文件夹 7 :return volumeImage:volume 8 ''' 9 reader = sitk.ImageSeriesReader() 10 dicomNames = reader.GetGDCMSeriesFileNames(folderPath) 11 reader.SetFileNames(dicomNames) 12 volumeImage = reader.Execute() 13 14 return volumeImage 15 16 def interpolate(volumeImage, newSpacing): 17 ''' 18 插值处理 19 :para volumeImage:volume格式 20 :para newSpaceing:想要插值或者重采样处理后得到的三个物理间隔,格式为列表 21 :return newVolumeImage:插值处理后的到的volume文件 22 ''' 23 resampleFilter = sitk.ResampleImageFilter() 24 resampleFilter.SetInterpolator(sitk.sitkLinear) ##此处为线性插值,其他插值方式可以去官网查询 25 resampleFilter.SetOutputDirection(volumeImage.GetDirection()) 26 resampleFilter.SetOutputOrigin(volumeImage.GetOrigin()) 27 28 newSpacing = np.array(newSpacing, float) 29 newSize = volumeImage.GetSize() / newSpacing * volumeImage.GetSpacing() 30 newSize = newSize.astype(np.int) 31 32 resampleFilter.SetSize(newSize.tolist()) 33 resampleFilter.SetOutputSpacing(newSpacing) 34 newVolumeImage = resampleFilter.Execute(volumeImage) 35 36 return newVolumeImage
6、医学影像重采样
1. 重采样
在医学图像预处理的过程中,常常需要对数据进行重采样,采样到我们需要的尺度。因为医学图像是和真实空间的物理尺寸相对应的。例如一个体素的大小是0.97mm 0.97mm 2.5mm,我们想将体素块的大小采样到1mm 1mm 1mm,这样可以帮助我们进行下一步处理。利用 sitk 可以完成这一项工作。
2. 代码
1 import SimpleITK as sitk 2 """ 3 resample 4 """ 5 6 def resampleVolume(outspacing,vol): 7 """ 8 将体数据重采样的指定的spacing大小\n 9 paras: 10 outpacing:指定的spacing,例如[1,1,1] 11 vol:sitk读取的image信息,这里是体数据\n 12 return:重采样后的数据 13 """ 14 outsize = [0,0,0] 15 inputspacing = 0 16 inputsize = 0 17 inputorigin = [0,0,0] 18 inputdir = [0,0,0] 19 20 #读取文件的size和spacing信息 21 22 inputsize = vol.GetSize() 23 inputspacing = vol.GetSpacing() 24 25 transform = sitk.Transform() 26 transform.SetIdentity() 27 #计算改变spacing后的size,用物理尺寸/体素的大小 28 outsize[0] = int(inputsize[0]*inputspacing[0]/outspacing[0] + 0.5) 29 outsize[1] = int(inputsize[1]*inputspacing[1]/outspacing[1] + 0.5) 30 outsize[2] = int(inputsize[2]*inputspacing[2]/outspacing[2] + 0.5) 31 32 #设定重采样的一些参数 33 resampler = sitk.ResampleImageFilter() 34 resampler.SetTransform(transform) 35 resampler.SetInterpolator(sitk.sitkLinear) 36 resampler.SetOutputOrigin(vol.GetOrigin()) 37 resampler.SetOutputSpacing(outspacing) 38 resampler.SetOutputDirection(vol.GetDirection()) 39 resampler.SetSize(outsize) 40 newvol = resampler.Execute(vol) 41 return newvol 42 43 def main(): 44 #读文件 45 vol = sitk.Image(sitk.ReadImage("input.mha")) 46 47 #重采样 48 newvol = resampleVolume([1,1,1],vol) 49 50 #写文件 51 wriiter = sitk.ImageFileWriter() 52 wriiter.SetFileName("output.mha") 53 wriiter.Execute(newvol)
标签:采样,sitk,target,img,spacing,尺寸,SimpleITK,resampler From: https://www.cnblogs.com/ybqjymy/p/17550438.html