背景需求
需要对MRI图像进行裁剪、放缩,但是要求放缩之后的影像空间必须与原图片的影像空间一致。
例:对(32, 32, 32)的图片放缩到(256, 256, 256),原始图片空间为(1.0, 1.0, 1.0)。对图片进行空间设置:放缩后图片空间(1.0, 1.0, 1.0);不对空间进行设置:放缩后的图片空间(0.125, 0.125, 0.125)。
代码实现
import numpy as np
import SimpleITK as sitk
# 读入图片
img_path = './mri.nii.gz'
img = sitk.ReadImage(img_path)
# re_img为放缩之后的图片大小,(256, 256, 256)为目标大小,sitkNeartestNeighbor是放缩用到的算法,默认为线性放缩,这里选择了最近邻
re_img = resize_image_itk(img, (256, 256, 256), resamplemethod=sitk.sitkNearestNeighbor)
# 对放缩后的图片进行一些操作
# 1.原图,2.空间,3.方向
re_img.SetOrigin(img.GetOrigin())
re_img.SetSpacing(img.GetSpacing())
re_img.SetDirection(img.GetDirection())
# 保存图片
sitk.WriteImage(re_img, './re_img.nii.gz')
其中resize_image_itk
函数为:
def resize_image_itk(itkimage, newSize, resamplemethod=sitk.sitkNearestNeighbor):
resampler = sitk.ResampleImageFilter()
originSize = itkimage.GetSize() # 获取原图size
originSpacing = itkimage.GetSpacing() # 获取原图spacing
newSize = np.array(newSize, dtype='uint32')
factor = originSize / newSize
newSpacing = originSpacing * factor
resampler.SetReferenceImage(itkimage) # 指定需要重新采样的目标图像
resampler.SetSize(newSize.tolist())
resampler.SetOutputSpacing(newSpacing.tolist())
resampler.SetTransform(sitk.Transform(3, sitk.sitkIdentity))
resampler.SetInterpolator(resamplemethod)
itkimgResampled = resampler.Execute(itkimage) # 得到重新采样后的图像
return itkimgResampled
至此,图片已经完成了放缩,并且放缩后图片的空间与原图片空间大小是同一的。