def Registration(ori_img, target_img, resamplemethod=sitk.sitkNearestNeighbor):
# print(" Ori Max Min : ", sitk.GetArrayFromImage(ori_img).max(), sitk.GetArrayFromImage(ori_img).min())
# print(" Sum of Ori : ", sitk.GetArrayFromImage(ori_img).sum())
"""
用itk方法将原始图像resample到与目标图像一致
:param ori_img: 原始需要对齐的itk图像
:param target_img: 要对齐的目标itk图像
:param resamplemethod: itk插值方法: sitk.sitkLinear-线性 sitk.sitkNearestNeighbor-最近邻
:return:img_res_itk: 重采样好的itk图像
使用示范:
import SimpleITK as sitk
target_img = sitk.ReadImage(target_img_file)
ori_img = sitk.ReadImage(ori_img_file)
img_r = resize_image_itk(ori_img, target_img, resamplemethod=sitk.sitkLinear)
"""
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]
ori_img.SetOrigin(target_origin) # 设置原始图像的起点为目标图像的起点 (因为勾画的时候没有设置origin,默认为(0,0,0),但是不影响勾画结果)
# itk的方法进行resample
resampler = sitk.ResampleImageFilter()
resampler.SetReferenceImage(target_img) # 需要重新采样的目标图像 (这一句话顶下面几句话)
# 设置目标图像的信息
# resampler.SetSize(target_Size) # 目标图像大小
# resampler.SetOutputOrigin(target_origin)
# resampler.SetOutputDirection(target_direction)
# resampler.SetOutputSpacing(target_Spacing)
resampler.SetDefaultPixelValue(0) # 设置默认像素值
# 根据需要重采样图像的情况设置不同的dype
if resamplemethod == sitk.sitkNearestNeighbor:
resampler.SetOutputPixelType(sitk.sitkUInt16) # 近邻插值用于mask的,保存uint8
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) # 得到重新采样后的图像
# print(" ORi Image Size = ", ori_img.GetSize())
# print(" ORi Image Spacing = ", ori_img.GetSpacing())
# print(" ORi Image Origin = ", ori_img.GetOrigin())
# print(" ORi Image Direction = ", ori_img.GetDirection())
# print(" Resample Image Size = ", itk_img_resampled.GetSize())
# print(" Resample Image Spacing = ", itk_img_resampled.GetSpacing())
# print(" Resample Image Origin = ", itk_img_resampled.GetOrigin())
# print(" Resample Image Direction = ", itk_img_resampled.GetDirection())
# print(" Target Image Size = ", target_img.GetSize())
# print(" Target Image Spacing = ", target_img.GetSpacing())
# print(" Target Image Origin = ", target_img.GetOrigin())
# print(" Target Image Direction = ", target_img.GetDirection())
# print(" Max Min : ", sitk.GetArrayFromImage(itk_img_resampled).max(), sitk.GetArrayFromImage(itk_img_resampled).min())
return itk_img_resampled, target_img
需要注意的点如下:
(1) 注意是mask还是image进行resample,需要采用不同的插值方法
(2) 注意ori_image和target_image之间的origin是否一致,如果不一致的话是否有影响?比如有一次处理mask和image的对齐,发现mask在勾画时用的origin为(0,0,0),但是不影响mask的位置,所以就应该先把mask.SetOrigin设置成target一样,不然就会在空间内把有效部分移走了。