resample_augmentations.py
def resample_image_itk(
ori_img,
new_spacing=[1.0,1.0,1.0],
new_size=[0,0,0],
resamplemethod=sitk.sitkNearestNeighbor):
"""
@Args:
:param ori_img: 原始需要对齐的itk图像
:param new_spacing: 111
:param new_size: 默认000, 注意非零则自动裁剪
:param resamplemethod:
sitk.sitkLinear-线性 - image
sitk.sitkNearestNeighbor-最近邻 -mask
@Return:
重采样好的itk图像
"""
ori_size = ori_img.GetSize() # 原始图像大小 [x,y,z]
ori_spacing = ori_img.GetSpacing() # 原始的体素块尺寸 [x,y,z]
ori_origin = ori_img.GetOrigin() # 原始的起点 [x,y,z]
ori_direction = ori_img.GetDirection() # 原始的方向 [冠,矢,横]=[z,y,x]
# 计算改变spacing后的size,用物理尺寸/体素的大小
if new_size==[0,0,0]:
new_size[0] = int(ori_size[0]*ori_spacing[0]/new_spacing[0] + 0.5)
new_size[1] = int(ori_size[1]*ori_spacing[1]/new_spacing[1] + 0.5)
new_size[2] = int(ori_size[2]*ori_spacing[2]/new_spacing[2] + 0.5)
# itk的方法进行resample
resampler = sitk.ResampleImageFilter()
resampler.SetReferenceImage(ori_img) # 需要重新采样的目标图像
# 设置目标图像的信息
resampler.SetSize(new_size) # 目标图像大小
resampler.SetOutputOrigin(ori_origin)
resampler.SetOutputDirection(ori_direction)
resampler.SetOutputSpacing(new_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)
return resampler.Execute(ori_img) # 得到重新采样后的图像