1. 需求
比如想把[48, 48, 32]的数据采样成[64, 64, 64]. Spacing可以会改变
2. 实现代码
def resample_ct(original_CT, save_path, label_flag=False): # target_size for sitk xyz):
# original_CT = sitk.ReadImage(patient_CT, sitk.sitkInt32)
dimension = original_CT.GetDimension()
reference_physical_size = np.zeros(original_CT.GetDimension())
reference_physical_size[:] = [(sz - 1) * spc if sz * spc > mx else mx for sz, spc, mx in
zip(original_CT.GetSize(), original_CT.GetSpacing(), reference_physical_size)]
reference_origin = original_CT.GetOrigin()
reference_direction = original_CT.GetDirection()
reference_size = target_size
reference_spacing = [phys_sz / (sz - 1) for sz, phys_sz in zip(reference_size, reference_physical_size)]
reference_image = sitk.Image(reference_size, original_CT.GetPixelIDValue())
reference_image.SetOrigin(reference_origin)
reference_image.SetSpacing(reference_spacing)
reference_image.SetDirection(reference_direction)
centering_transform = sitk.TranslationTransform(dimension)
if label_flag:
regis = sitk.Resample(original_CT, reference_image, centering_transform, sitk.sitkNearestNeighbor, 0.0)
else:
regis = sitk.Resample(original_CT, reference_image, centering_transform, sitk.sitkLinear, 0.0)
sitk.WriteImage(regis, save_path)
return regis
3. 困惑
核心代码就这一行,具体细节还不清楚,centering_transform在这里面起什么作用(希望后面能补充)
regis = sitk.Resample(original_CT, reference_image, centering_transform, sitk.sitkNearestNeighbor, 0.0)
4. 参考
Image Registration Method 3 — SimpleITK 2.0rc2 documentation