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

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

### 3D肝脏分割预处理技术及方法 #### 数据获取与准备 对于3D肝脏分割任务,通常会使用专门的数据集来训练模型。例如,在LiTS17挑战赛中使用的数据集包含了多个病人的CT扫描结果,这些扫描被存储为`.nii`格式的文件[^2]。 #### 文件转换 为了便于后续处理和分析,可能需要将DICOM序列或其他格式(如`.mha`, `.nrrd`)转化为更易于操作的形式,比如Numpy数组或PNG图片。这一步骤可以通过Python库SimpleITK实现: ```python import SimpleITK as sitk def nii_to_npy(nii_file_path, npy_save_path): img = sitk.ReadImage(nii_file_path) array = sitk.GetArrayFromImage(img) numpy.save(npy_save_path, array) def dcm_series_to_nifti(dicom_dir, output_filename): reader = sitk.ImageSeriesReader() dicom_names = reader.GetGDCMSeriesFileNames(dicom_dir) reader.SetFileNames(dicom_names) image = reader.Execute() sitk.WriteImage(image, output_filename + ".nii.gz") ``` #### 图像标准化 由于不同设备采集到的图像可能存在亮度、对比度等方面的差异,因此有必要对输入图像执行标准化操作。常用的方法包括但不限于直方图匹配、Z-score规范化等[^3]: ```python from skimage import exposure def histogram_matching(src_img, ref_img): matched = exposure.match_histograms(src_img, ref_img) return matched def z_score_normalization(slice_data): mean_val = slice_data.mean() std_dev = slice_data.std() normalized_slice = (slice_data - mean_val) / std_dev return normalized_slice ``` #### 噪声去除 实际临床环境中获得的CT图像往往含有噪声干扰,影响最终分割效果。可以采用多种滤波器来进行降噪处理,如高斯平滑、各向异性扩散过滤等: ```python import scipy.ndimage.filters as filters def gaussian_smoothing(input_image, sigma=1.0): smoothed = filters.gaussian_filter(input_image.astype(float), sigma=sigma) return smoothed ``` #### 尺寸调整与裁剪 考虑到计算资源限制以及提高效率的需求,有时还需要对三维体素进行重采样(resampling),使其达到统一的空间分辨率;另外也可以通过设定感兴趣区域(ROI)的方式减少不必要的背景信息参与运算过程。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值