首页 > 其他分享 >SimpleITK 重采样数据到固定尺寸

SimpleITK 重采样数据到固定尺寸

时间:2023-07-13 14:58:03浏览次数:39  
标签:采样 sitk target img spacing 尺寸 SimpleITK resampler

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

相关文章

  • SimpleITK 图像配准
    SimpleITK图像配准在网上找的资源,效果不佳,等清楚了函数和原理再细改,调试效果。1#-*-coding:UTF-8-*-2#@file:regist.py3#@Time:2021-11-1217:004#@Author:wmz56importSimpleITKassitk78#Utilitymethodthateither......
  • SimpleITK 图像对齐
    1、使用SimpleITK对齐图像在看voxelmorph的代码,看到图像对齐部分,记录一下。下面是从voxelmorph项目中截取的一段保存图像的函数。函数输入分别是:配准后的图像、固定图像、要将配准图像保存的名字。将图像对齐的操作需要将对齐的图像的原点、方向、间距设置成与被对齐的图像一致。......
  • SimpleITK 读写nii.gz文件
    1、读写nii.gz文件1##usingsimpleITKtoloadandsavedata.2importSimpleITKassitk3itk_img=sitk.ReadImage('./nifti.nii.gz')4img=sitk.GetArrayFromImage(itk_img)5print("imgshape:",img.shape)67##save8out=si......
  • SimpleITK 三维图像分析
    1、去除3D小连通域在一些计算机视觉任务中,需要对模型的输出做一些后处理以优化视觉效果,连通域就是一种常见的后处理方式。尤其对于分割任务,有时的输出mask会存在一些假阳(小的无用轮廓),通过3D连通域找出面积较小的独立轮廓并去除可以有效地提升视觉效果。二维图像连通域一......
  • SimpleITK 简单使用
    SimpleITKITK是一个开源、跨平台的框架,提供给开发者增强功能的图像分析和处理套件(推荐使用)。Note:注意SimpleITK不支持中文,即路径中不能有中文X射线图像对应的读取1#@file:itk_p1.py2#@Time:2021/8/2816:273#@Author:wmz4importSimpleITKassitk......
  • iOS app图标尺寸规范速查表:设计师收藏必备!
    在UI设计中,图标作为重要的视觉元素扮演着不可或缺的角色。尽管图标所占空间相对较小,却是衡量设计师基本功的重要标准。了解图标设计和遵守iOSapp图标规范是每个设计师入门UI设计的必备条件。本文将深入探索iOSapp图标规范,为设计师们提供有价值的指导和灵感。  ios应用程......
  • 单电阻采样的永磁同步电机相电流重构策略仿真,波形效果佳。
    单电阻采样的永磁同步电机相电流重构策略仿真,波形效果佳。YID:4870662310628516......
  • 这是一个关于LabVIEW视觉一键尺寸测量仪的描述,它具有以下特点:支持多种产品和尺寸的测
    这是一个关于LabVIEW视觉一键尺寸测量仪的描述,它具有以下特点:支持多种产品和尺寸的测量,可以快速进行编辑、测量和导出结果。这个领域涉及到的知识点和领域范围包括:LabVIEW、视觉测量、尺寸测量、编辑功能和结果导出。LabVIEW是一种图形化编程环境,用于开发和控制各种测量和自动化系......
  • jmeter---解决同一线程组下不同http采样器使用不同请求头的问题
    问题:某个线程组M中包含一个信息头管理器1,和a、b、c、d等多个http取样器,这几个取样器共用一个信息头管理器1,但当我再增加一个接口请求e时,发现此接口请求ed的请求头中的content-type是需要application/x-www-form-urlencoded类型的,而信息头管理器1中定义的content-type是appli......
  • 怎么修改图片清晰度?在线调整图片质量(不改变尺寸)
    功能地址在线修改证件照质量,调整图片清晰度,提高照片质量教程,批量免费|TOFORU在线工具软件定制地址:https://tool.toforu.com/f/img_quality.html功能说明在线修改证件照质量,提高照片质量,调整图片清晰度,批量免费。支持参数:输入质量功能使用相关知识修改图片质量(不......