Python SimpleItk库的重采样(resample)方法和代码小记

Python SimpleItk库的重采样(resample)方法和代码小记,第1张

概述记:在重采样(resample)上面探过的一些坑,以及最终发现的简单方法需求:已有配准好的CT以及PET图像,而金标准label是在CT上勾画的,因此有一些简单的需求,一种是把PET图像重采样到与CT图像一样的大小(比如从192×192×371到512×512×484),或者把金标准Mask降到同PET一样的大小(即反过来)。

记:在重采样(resample)上面探过的一些坑,以及最终发现的简单方法
需求:已有配准好的CT以及PET图像,而金标准label是在CT上勾画的,因此有一些简单的需求,一种是把PET图像重采样到与CT图像一样的大小(比如从192×192×371到512×512×484),或者把金标准Mask降到同PET一样的大小(即反过来)。
怎么找的方法:使用过SITK-SNAP(3.8版本),它的一个读图功能是支持不同大小、spacing、origin、direction的图像一起展示的,软件会相当于给你resample好了展示出来;因此已知ITK存在解决的方法了,剩下就是找对应代码

直接上最终的Python代码:
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图像    """    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的方法进行resample    resampler = sitk.ResampleImageFilter()    resampler.SetReferenceImage(ori_img)  # 需要重新采样的目标图像    # 设置目标图像的信息    resampler.SetSize(target_Size)		# 目标图像大小    resampler.SetoutputOrigin(target_origin)    resampler.SetoutputDirection(target_direction)    resampler.SetoutputSpacing(target_Spacing)    # 根据需要重采样图像的情况设置不同的dype    if resamplemethod == sitk.sitkNearestNeighbor:        resampler.SetoutputPixelType(sitk.sitkUInt16)   # 近邻插值用于mask的,保存uint16    else:        resampler.SetoutputPixelType(sitk.sitkfloat32)  # 线性插值用于PET/CT/MRI之类的,保存float32    resampler.Settransform(sitk.transform(3, sitk.sitkIDentity))        resampler.SetInterpolator(resamplemethod)    itk_img_resampled = resampler.Execute(ori_img)  # 得到重新采样后的图像    return itk_img_resampled
踩的坑:

之前在网上找代码的时候,看到这样一份代码,这个是计算一个new_size,即通过两个图像的spacing来计算重采样之后的图像的大小,代码如下:

# 初始版本,from网上,适用于只有spacing不同的两个图def resize_image(itkimage, newSize, resamplemethod=sitk.sitkNearestNeighbor):    print('--resize ing--')    resampler = sitk.ResampleImageFilter()    originSize = itkimage.GetSize()  # 原来的体素块尺寸    originSpacing = itkimage.GetSpacing()    newSize = np.array(newSize, float)    factor = originSize / newSize    newSpacing = originSpacing * factor    newSize = newSize.astype(np.int)    # spacing肯定不能是整数    resampler.SetReferenceImage(itkimage)  # 需要重新采样的目标图像    resampler.SetSize(newSize.toList())    resampler.SetoutputSpacing(newSpacing.toList())    resampler.Settransform(sitk.transform(3, sitk.sitkIDentity))    resampler.SetInterpolator(resamplemethod)    itk_img_res = resampler.Execute(itkimage)  # 得到重新采样后的图像    print('--resize finish--')    return itk_img_res

实际使用中发现,如果通过计算得到的newsize来 resampler.SetSize(new_size) 的话,new_size不一定和目标图像的size一致,原因是两个图像在origin、direction方面很有可能不一致(尤其对于医学影像),因此使用这份代码会导致还需要对resample后的图像进行各种后处理 *** 作。。pad或者cut啥的(头秃地想了好多代码,结果最后都用不上,泪目)

最后是通过这份代码的sitk.ResampleImageFilter(),进去看各个功能函数,突然想试试如果set的是目标图像的大小的话,是不是应该跟软件一样直接给到正确的结果呢,结果发现真的是可以的。。。。

不过过程中学到蛮多itk图像的属性、空间坐标转换之类的一些知识,还行吧。。
小记一下这个插曲
2021/04/17

总结

以上是内存溢出为你收集整理的Python SimpleItk库的重采样(resample)方法和代码小记全部内容,希望文章能够帮你解决Python SimpleItk库的重采样(resample)方法和代码小记所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1187370.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存