【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)

如此便可以实现同时将原始影像与勾画文件进行重采样

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐