【Python医学影像从超详细入门】4.图像重采样及原勾画适配(DICOM NII NII.GZ NRRD)

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

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

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值