【Python医学影像从超详细入门】4.图像重采样及原勾画适配(DICOM NII NII.GZ NRRD)
医学影像重采样的相关文章与python方法已经有很多,但是读了大多数都没有提到原勾画文件的处理方法(重采样后影像发生了变化,若勾画发生在重采样之前,则会导致勾画文件无法正常使用)。
因此本文为您提供了原勾画文件的适配方法。
本实验所用到的库:
SimpleITK
numpy
若缺少,请您先在控制台安装所缺少的库:
#SimpleITK:
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple SimpleITK
#numpy:
pip install numpy
首先为您提供重采样的python代码:
def resample(path,savepath,out_spacing=[1,1,1]):
img = sitk.ReadImage(path)
original_spacing = img.GetSpacing()
original_size = img.GetSize()
out_size = [
int(np.round(original_size[0] * original_spacing[0] / out_spacing[0])),
int(np.round(original_size[1] * original_spacing[1] / out_spacing[1])),
int(np.round(original_size[2] * original_spacing[2] / out_spacing[2]))
]
resample = sitk.ResampleImageFilter()
resample.SetOutputSpacing(out_spacing)
resample.SetSize(out_size)
resample.SetOutputDirection(img.GetDirection())
resample.SetOutputOrigin(img.GetOrigin())
resample.SetTransform(sitk.Transform())
resample.SetDefaultPixelValue(img.GetPixelIDValue())
resample.SetInterpolator(sitk.sitkBSpline)
out = resample.Execute(img)
sitk.WriteImage(out,savepath)
同时,需要将勾画文件适配同样的变换。
def maskresample(resamplepath,maskpath,savepath):
original_segmentation = sitk.ReadImage(maskpath)
resampled_image = sitk.ReadImage(resamplepath)
#使用与图像相同的变换对原始勾画数据进行重采样
resampled_segmentation = sitk.Resample(original_segmentation,
size=resampled_image.GetSize(),
outputOrigin=resampled_image.GetOrigin(),
outputSpacing=resampled_image.GetSpacing(),
outputDirection=resampled_image.GetDirection(),
interpolator=sitk.sitkNearestNeighbor)
#保存重采样后的勾画数据
sitk.WriteImage(resampled_segmentation, savepath)
完整演示代码:
import SimpleITK as sitk
import numpy as np
def resample(path,savepath,out_spacing=[1,1,1]):
img = sitk.ReadImage(path)
original_spacing = img.GetSpacing()
original_size = img.GetSize()
out_size = [
int(np.round(original_size[0] * original_spacing[0] / out_spacing[0])),
int(np.round(original_size[1] * original_spacing[1] / out_spacing[1])),
int(np.round(original_size[2] * original_spacing[2] / out_spacing[2]))
]
resample = sitk.ResampleImageFilter()
resample.SetOutputSpacing(out_spacing)
resample.SetSize(out_size)
resample.SetOutputDirection(img.GetDirection())
resample.SetOutputOrigin(img.GetOrigin())
resample.SetTransform(sitk.Transform())
resample.SetDefaultPixelValue(img.GetPixelIDValue())
resample.SetInterpolator(sitk.sitkBSpline)
out = resample.Execute(img)
sitk.WriteImage(out,savepath)
def maskresample(resamplepath,maskpath,savepath):
original_segmentation = sitk.ReadImage(maskpath)
resampled_image = sitk.ReadImage(resamplepath)
#使用与图像相同的变换对原始勾画数据进行重采样
resampled_segmentation = sitk.Resample(original_segmentation,
size=resampled_image.GetSize(),
outputOrigin=resampled_image.GetOrigin(),
outputSpacing=resampled_image.GetSpacing(),
outputDirection=resampled_image.GetDirection(),
interpolator=sitk.sitkNearestNeighbor)
#保存重采样后的勾画数据
sitk.WriteImage(resampled_segmentation, savepath)
path = r"C:\Users\QDUMIAO\Desktop\ori.nii.gz" #原始影像
savepath = r"C:\Users\QDUMIAO\Desktop\ori2.nii.gz" #重采样后的名字
path2 = r"C:\Users\QDUMIAO\Desktop\mask.nii" #原勾画
savepath2 = r"C:\Users\QDUMIAO\Desktop\mask2.nii" #重采样后的勾画
resample(path,savepath,[1,1,1])
maskresample(savepath,path2,savepath2)
如此便可以实现同时将原始影像与勾画文件进行重采样