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

更新时间:2023-04-23 18:29:59 阅读: 评论:0


2023年4月23日发(作者:上海大众新领驭)

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 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图