SimpleItk库的医学图像重采样(resample)实现代码Python
记:关于图像重采样(resample)最终发现的简单实现⽅法
需求:已有配准好的CT以及PET图像,⽽⾦标准label是在CT上勾画的,因此有⼀些简单的需求,⼀种是把PET图像重采样到与CT图像⼀样
的⼤⼩(⽐如从192192371到512512484),或者把⾦标准Mask降到同PET的⼤⼩(即反过来)。
怎么找的⽅法:ITK-SNAP(3.8版本)的读图功能是⽀持不同⼤⼩、spacing、origin、direction的图像⼀起展⽰的,软件会相当于
resample后续加⼊的图像; 因此,已知ITK存在解决的⽅法了,剩下就是找对应代码。
直接上最终的Python代码:
import SimpleITK as sitk
def resize_image_itk(ori_img, target_img, resamplemethod=sitk.sitkNearestNeighbor):
"""
⽤itk⽅法将原始图像resample到与⽬标图像⼀致
:param ori_img: 原始需要对齐的itk图像
:param target_img: 要对齐的⽬标itk图像
:param resamplemethod: itk插值⽅法:路由器有线桥接 near-线性 arestNeighbor-最近邻
:return:img_res_itk: 重采样好的itk图像
使⽤⽰范:
import SimpleITK as sitk
target_img = age(target_img_file)
ori_img = age(ori_img_file)
img_r = resize_image_itk(ori_img, target_img, resamplemethod=near)如何做一个好老师
"""
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]
⽬标的⽅向冠⽮横
# itkresample
的⽅法进⾏
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.SetOutputPix古琴高山流水 elType(sitk.sitkUInt8) # maskuint8
近邻插值⽤于的,保存
el:
resampler.SetOutputPixelType(sitk.sitkFloat32) # PET/CT/MRIfloat32
线性插值⽤于之类的,保存
resampler.SetTransform(sitk.Transform(3, sitk.sitkIdentity))
resampler.SetInterpolator(resamplemethod)
itk_img_resampled = resampler.Execute(ori_img) #
得到重新采样后的图像
return itk_img_resampled
额外Tips:
⼀开始找到这样⼀份代码,是通过两个图像的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
newSpa单核细胞计数 cing = originSpacing * factor
newSize = newSize.astype(np.int) # spacing
肯定不能是整数
resampler.SetReferenceImage(itkimage) #
需要重新采样的⽬标图像
resampler.SetSize(newSize.tolist())
resampler.SetOutputSpacing(newSpacing.tolist())
resampler.SetTra小青蛙卡通图片 nsform(sitk.Transform(3, sitk.sitkIdentity))
resampler.SetInterpolator(resamplemethod)
itk_img_res = resampler.Execute(itkimage) #
得到重新采样后的图像
print('--resize finish--')
return itk_img_res
实际使⽤发现,如果通过计算得到的newsize来 e(ne笑话集锦 w_size) 的话,new_size不⼀定和⽬标图像的size⼀致,原因是两
个图像在origin、direction⽅⾯很有可能不⼀致(尤其对于医学影像),因此使⽤这份代码会导致后⾯还需要对resample后的图像进⾏各
种后处理操作波子汽水怎么开 ,⽐如pad空矩阵或者cut图像啥的,更会涉及复杂的空间坐标变换。
最后是查看leImag怎样腌辣椒 eFilter()的各个功能函数,突然想试试如果tsize的是⽬标图像的⼤⼩的话,是不是应该跟软件⼀样直接
给到正确的结果呢,结果发现,确实。。。
温馨提⽰:
读⼊ori和target的sitk图像时,要确保spacing这些信息没有丢失,如果前⾯有从sitk转array处理过再转回sitk的操作的话,记得⽤
formation( ) 把原本的信息复制过来再进⾏resample,否则会导致输出图像为空矩阵。
本文发布于:2023-04-23 18:29:59,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/511261.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |