ITK学习笔记(九) simpleITK重采样数据到固定尺寸

  • 1、resampleSize
  • 2、CT图像预处理之重采样
  • 3、SKIMAGE.TRANSFORM-两种缩放皆可
  • 4、Python SimpleItk库的医学图像重采样(resample)实现代码
  • 5、使用SimpleITK对volume文件进行插值处理
  • 6、医学影像重采样
    • 1. 重采样
    • 2. 代码

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采样进行反操作

"""
统一Size
X轴和Y轴的Size和Spacing没有变化,
Z轴的Size和Spacing有变化
"""
def resampleSize(sitkImage, depth):#重采样函数euler3d = sitk.Euler3DTransform()xsize, ysize, zsize = sitkImage.GetSize()xspacing, yspacing, zspacing = sitkImage.GetSpacing()new_spacing_z = zspacing/(depth/float(zsize))origin = sitkImage.GetOrigin()direction = sitkImage.GetDirection()#根据新的spacing 计算新的sizenewsize = (xsize,ysize,int(zsize*zspacing/new_spacing_z))newspace = (xspacing, yspacing, new_spacing_z)sitkImage = sitk.Resample(sitkImage,newsize,euler3d,sitk.sitkNearestNeighbor,origin,newspace,direction)return sitkImageDEPTH = 16  #需要重采样Size的层数#读取nifit原数据 ,size为:(880, 880, 12)
NifitmPath = 'work/data/nifit/Case14.nii.gz'
sitkImage = sitk.ReadImage(NifitmPath)
print("重采样前的信息")
print("尺寸:{}".format(sitkImage.GetSize()))
print("体素大小(x,y,z):{}".format(sitkImage.GetSpacing()) )print('='*30+'我是分割线'+'='*30)newsitkImage = resampleSize(sitkImage, depth=DEPTH)
print("重采样后的信息")
print("尺寸:{}".format(newsitkImage.GetSize()))
print("体素大小(x,y,z):{}".format(newsitkImage.GetSpacing()) )
重采样前的信息
尺寸:(880, 880, 12)
体素大小(x,y,z):(0.3448275923728943, 0.3448275923728943, 5.499998092651367)
==============================我是分割线==============================
重采样后的信息
尺寸:(880, 880, 16)
体素大小(x,y,z):(0.3448275923728943, 0.3448275923728943, 4.124998569488525)

参考:重采样(统一Size)

2、CT图像预处理之重采样

按照指定spacing 重采样数据的缺点就是一般无法重采样到指定尺寸。实际应用中经常遇到需要指定尺寸图像的情况。

def Resampling(img,lable = False):original_size = img.GetSize() #获取图像原始尺寸original_spacing = img.GetSpacing() #获取图像原始分辨率new_spacing = [1, 1, 1] #设置图像新的分辨率为1*1*1new_size = [int(round(original_size[0] * (original_spacing[0] /1))),int(round(original_size[1] * (original_spacing[1] / 1))),int(round(original_size[2] * (original_spacing[2] / 1)))] #计算图像在新的分辨率下尺寸大小resampleSliceFilter = sitk.ResampleImageFilter() #初始化if lable == False:Resampleimage = resampleSliceFilter.Execute(img, new_size, sitk.Transform(), sitk.sitkBSpline,img.GetOrigin(), new_spacing, img.GetDirection(), 0,img.GetPixelIDValue())ResampleimageArray = sitk.GetArrayFromImage(Resampleimage)ResampleimageArray[ResampleimageArray < 0] = 0 #将图中小于0的元素置为0else:# for label, should use sitk.sitkLinear to make sure the original and resampled label are the same!!!Resampleimage = resampleSliceFilter.Execute(img, new_size, sitk.Transform(), sitk.sitkLinear,img.GetOrigin(), new_spacing, img.GetDirection(), 0,img.GetPixelIDValue())ResampleimageArray = sitk.GetArrayFromImage(Resampleimage)

3、SKIMAGE.TRANSFORM-两种缩放皆可

# 1、按目标大小缩放resize
skimage.transform.resize(image, output_shape, order=1, mode='reflect', cval=0, clip=True, preserve_range=False, anti_aliasing=True, anti_aliasing_sigma=None)
# 2、按缩放因子缩放rescale
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)# The order of interpolation. The order has to be in the range 0-5:
# 0: Nearest-neighbor
# 1: Bi-linear (default)
# 2: Bi-quadratic
# 3: Bi-cubic
# 4: Bi-quartic
# 5: Bi-quintic

参考:CT图像预处理之重采样

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存在解决的方法了,剩下就是找对应代码。

import SimpleITK as sitkdef resize_image_itk(ori_img, target_img, resamplemethod=sitk.sitkNearestNeighbor):"""用itk方法将原始图像resample到与目标图像一致:param ori_img: 原始需要对齐的itk图像:param target_img: 要对齐的目标itk图像:param resamplemethod: itk插值方法: sitk.sitkLinear-线性  sitk.sitkNearestNeighbor-最近邻:return:img_res_itk: 重采样好的itk图像使用示范:import SimpleITK as sitktarget_img = sitk.ReadImage(target_img_file)ori_img = sitk.ReadImage(ori_img_file)img_r = resize_image_itk(ori_img, target_img, resamplemethod=sitk.sitkLinear)"""target_Size = target_img.GetSize()      # 目标图像大小  [x,y,z]target_Spacing = target_img.GetSpacing()   # 目标的体素块尺寸    [x,y,z]target_origin = target_img.GetOrigin()      # 目标的起点 [x,y,z]target_direction = target_img.GetDirection()  # 目标的方向 [冠,矢,横]=[z,y,x]# itk的方法进行resampleresampler = sitk.ResampleImageFilter()resampler.SetReferenceImage(ori_img)  # 需要重新采样的目标图像# 设置目标图像的信息resampler.SetSize(target_Size)       # 目标图像大小resampler.SetOutputOrigin(target_origin)resampler.SetOutputDirection(target_direction)resampler.SetOutputSpacing(target_Spacing)# 根据需要重采样图像的情况设置不同的dypeif resamplemethod == sitk.sitkNearestNeighbor:resampler.SetOutputPixelType(sitk.sitkUInt8)   # 近邻插值用于mask的,保存uint8else:resampler.SetOutputPixelType(sitk.sitkFloat32)  # 线性插值用于PET/CT/MRI之类的,保存float32resampler.SetTransform(sitk.Transform(3, sitk.sitkIdentity))    resampler.SetInterpolator(resamplemethod)itk_img_resampled = resampler.Execute(ori_img)  # 得到重新采样后的图像return itk_img_resampled

参考:Python SimpleItk库的医学图像重采样(resample)实现代码

5、使用SimpleITK对volume文件进行插值处理

在进行dicom文件分析时,往往会对其进行插值或者重采样处理,可以使用SimpleITK轻松完成。

import SimpleITK as sitkdef getDicomSeriesVolumeImage(folderPath):'''读取dicom序列文件:para folderPath:dicom文件夹:return volumeImage:volume'''reader = sitk.ImageSeriesReader()dicomNames = reader.GetGDCMSeriesFileNames(folderPath)reader.SetFileNames(dicomNames)volumeImage = reader.Execute()return volumeImagedef interpolate(volumeImage, newSpacing):'''插值处理:para volumeImage:volume格式:para newSpaceing:想要插值或者重采样处理后得到的三个物理间隔,格式为列表:return newVolumeImage:插值处理后的到的volume文件'''resampleFilter = sitk.ResampleImageFilter()resampleFilter.SetInterpolator(sitk.sitkLinear)   ##此处为线性插值,其他插值方式可以去官网查询resampleFilter.SetOutputDirection(volumeImage.GetDirection())resampleFilter.SetOutputOrigin(volumeImage.GetOrigin())newSpacing = np.array(newSpacing, float)newSize = volumeImage.GetSize() / newSpacing * volumeImage.GetSpacing()newSize = newSize.astype(np.int)resampleFilter.SetSize(newSize.tolist())resampleFilter.SetOutputSpacing(newSpacing)newVolumeImage = resampleFilter.Execute(volumeImage)return newVolumeImage

参考:使用SimpleITK对volume文件进行插值处理

6、医学影像重采样

1. 重采样

在医学图像预处理的过程中,常常需要对数据进行重采样,采样到我们需要的尺度。因为医学图像是和真实空间的物理尺寸相对应的。例如一个体素的大小是0.97mm 0.97mm 2.5mm,我们想将体素块的大小采样到1mm 1mm 1mm,这样可以帮助我们进行下一步处理。利用 sitk 可以完成这一项工作。

2. 代码

import SimpleITK as sitk
"""
resample
"""def resampleVolume(outspacing,vol):"""将体数据重采样的指定的spacing大小\nparas:outpacing:指定的spacing,例如[1,1,1]vol:sitk读取的image信息,这里是体数据\nreturn:重采样后的数据"""outsize = [0,0,0]inputspacing = 0inputsize = 0inputorigin = [0,0,0]inputdir = [0,0,0]#读取文件的size和spacing信息inputsize = vol.GetSize()inputspacing = vol.GetSpacing()transform = sitk.Transform()transform.SetIdentity()#计算改变spacing后的size,用物理尺寸/体素的大小outsize[0] = int(inputsize[0]*inputspacing[0]/outspacing[0] + 0.5)outsize[1] = int(inputsize[1]*inputspacing[1]/outspacing[1] + 0.5)outsize[2] = int(inputsize[2]*inputspacing[2]/outspacing[2] + 0.5)#设定重采样的一些参数resampler = sitk.ResampleImageFilter()resampler.SetTransform(transform)resampler.SetInterpolator(sitk.sitkLinear)resampler.SetOutputOrigin(vol.GetOrigin())resampler.SetOutputSpacing(outspacing)resampler.SetOutputDirection(vol.GetDirection())resampler.SetSize(outsize)newvol = resampler.Execute(vol)return newvol    def main():#读文件vol = sitk.Image(sitk.ReadImage("input.mha"))#重采样newvol = resampleVolume([1,1,1],vol)#写文件wriiter = sitk.ImageFileWriter()wriiter.SetFileName("output.mha")wriiter.Execute(newvol)

参考:医学影像重采样

ITK学习笔记(九) simpleITK重采样数据到固定尺寸相关推荐

  1. at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验

    Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...

  2. ITK学习笔记(十一) SimpleITK相关使用

    ITK学习笔记(十一) SimpleITK相关使用 参考:[SimpleITK]医疗影像分割结果评价指标计算 参考:Python SimpleITK.GetArrayViewFromImage方法代码 ...

  3. ITK学习笔记(十二) SimpleITK获取二值图像bbox

    ITK学习笔记(十二) SimpleITK获取二值图像bbox sitk_ seg_ img = sitk . ReadImage( m ) bbox =get_ bbox_ from mask(si ...

  4. ITK学习笔记(七) ITK旋转方向位置不变

    ITK学习笔记(七) ITK旋转方向位置不变 sitk使用的使LPS坐标系,与slicer中使用的RAS坐标系不同. 在sitk中的方向(1,1,1)(1,1,1)(1,1,1),在slicer中的方 ...

  5. ITK学习笔记(一)ITK的使用

    ITK学习笔记(一)ITK的使用 第一个ITK程序 1.CMakeLists.txt 2. 测试数据 3.代码 4.结果 ITK官方文档 第一个ITK程序 1.CMakeLists.txt # Thi ...

  6. 影像组学视频学习笔记(30)-SMOTE解决数据不平衡的问题、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(30)主要介绍: SMOTE解决数据不平衡的问题 SMOTE基本介绍 SMOTE (Synthetic Minority Over-sa ...

  7. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  8. 吴恩达《机器学习》学习笔记九——神经网络相关(1)

    吴恩达<机器学习>学习笔记九--神经网络相关(1) 一. 非线性假设的问题 二. 神经网络相关知识 1.神经网络的大致历史 2.神经网络的表示 3.前向传播:向量化表示 三. 例子与直觉理 ...

  9. JavaScript学习笔记(九)(验证框架,layer弹出层)

    JavaScript学习笔记(九) 一.jQuery Validate验证框架 1.引入相关插件路径 2. 修改一些规则 3. 自定义验证规则 4.异步验证 整体代码 二.layer弹出层 1.引入相 ...

最新文章

  1. String和C#中的string有什么区别?
  2. C++及Windows异常处理(try,catch; __try,__finally; __try, __except)——一道笔试题引起的探究
  3. wxPython多线程界面卡死或在不同平台崩溃问题
  4. 怎样使用Spring Boot项目的单元测试?
  5. 分布式服务框架dubbo原理解析 转
  6. 内存泄露、内存溢出以及解决方法
  7. 揭晓新版《Windows Sysinternals实战指南》读书积赞活动
  8. BZOJ1031: [JSOI2007]字符加密Cipher
  9. 高中计算机学考操作ppt,高中信息技术基础学考专题复习(共25张PPT)
  10. 无法在只读编辑器中编辑_Mol Plant中国农科院作物科学研究所夏兰琴课题组成功利用 优化的引导基因编辑器在水稻中实现高效精准基因编辑...
  11. selenium 安装报错问题
  12. Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
  13. WiFi HAL 启动
  14. 抖音小程序达人入驻壁纸微信小程序安装教程
  15. prometheus使用cAdvisor监控容器
  16. Windows主机加固
  17. error:‘%include‘ expects a file name
  18. qcustomplot绘制柱状图
  19. 在Excel中选取一行中的最大数值进行标题匹配
  20. day26-多进程多线程

热门文章

  1. 机器学习十大算法之Matlab-9降维算法
  2. 黑河市应急管理局多融合应急通信建设
  3. 游戏中的drawcalls值
  4. Access、SQLServer以及SQLite的日期时间差计算
  5. 软银孙正义:未来十年押注移动互联网
  6. let与const心智模型
  7. 机器学习算法--python--sklearn--后续神经网络
  8. winscp连接验证日志(具体情况参见会话日志): 使用用户名 root。验证失败
  9. 学无止境,温故而知新
  10. 小白学做网云小程序(2)