医学图像重采样spacing和direction

本文介绍了在NII图像分割中处理不同Z轴spacing和非标准方向的方法。通过ResampleImageFilter调整spacing,纠正方向并提供公式处理非标准方向下的像素坐标转换。重点在于如何使用setSpacing(), setOutputDirection()等函数进行图像重构和坐标转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 最近在进行nii图像分割的时候发现不同的图像z轴spacing之间差距很大,而且有的direction不是标准的有倾斜,于是查找了一下代码进行调整

当只改变z轴的sapcing时只需要设置setSpacing()就可以了。

def resample_image(itk_image, out_spacing,out_direction, is_label=False):
    original_size = itk_image.GetSize()
    original_spacing = itk_image.GetSpacing()
    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(out_direction)
    resample.SetOutputOrigin(itk_image.GetOrigin())


    if is_label:
        resample.SetDefaultPixelValue(0)  # 没有图像的地方填充值
        resample.SetInterpolator(sitk.sitkNearestNeighbor)
    else:
        resample.SetDefaultPixelValue(-10)  # -10是我调整的窗宽窗外
        resample.SetInterpolator(sitk.sitkBSpline)

    return resample.Execute(itk_image)

二 对图像某一点的像素进行矫正,比如a图像的direction不是标准的【1,0,0,0,1,0,0,0,1】,求他的某一点(x,y,z)在标准direction的设备坐标

正常的设备坐标转像素坐标

(设备坐标-origin)/spacing = 像素坐标

从非标准的转到标准的涉及到一个过渡矩阵的概念
自然基A的转到非自然基B的过度矩阵为非自然基 于是就有了 以后公式
z为非标准direction下某一点像素的坐标 d为direction的列表

d = np.array(d).reshape((3,3))
x = np.matmul(np.matmul(np.array(z),d), spacing) +origin
### 图像重采样技术概述 图像重采样是一种用于调整医学图像空间分辨率的技术,使得不同扫描设备获取的图像能够具有统一的空间属性。这有助于后续分析的一致确性[^1]。 #### 使用场景 当需要对来自不同成像模态或参数设置下的多源数据进行融合、比较时,通常会应用图像重采样来确保这些图像是基于相同的坐标系尺度定义下表示。此外,在备训练机器学习模型的数据集过程中也经常遇到这种情况——为了使输入特征保持一致而执行此操作[^2]。 #### 设置重采样 Spacing 的原则 对于如何设定新的间距(Spacing),一般有两种策略: - **固定目标尺寸法**:根据具体应用场景的需求指定一个标大小作为最终输出的目标尺寸; - **最小公倍数法**:选取所有待处理样本中各维度上最小像素间隔作为公共基值,从而尽可能保留原始细节信息的同时减少形变失真风险。 实际项目里往往依据实验设计目的灵活选用上述两种方式之一来进行置。 #### Python SimpleITK 实现案例 下面给出一段利用Python编程语言合SimpleITK库完成基本功能的例子: ```python import SimpleITK as sitk def resample_image(image_path, new_spacing=(1.0, 1.0, 1.0)): image = sitk.ReadImage(image_path) original_spacing = image.GetSpacing() original_size = image.GetSize() # 计算新尺寸 new_size = [ int(round(osz * ospc / nspc)) for osz, ospc, nspc in zip(original_size, original_spacing, new_spacing) ] resampler = sitk.ResampleImageFilter() resampler.SetOutputDirection(image.GetDirection()) resampler.SetOutputOrigin(image.GetOrigin()) resampler.SetOutputSpacing(new_spacing) resampler.SetSize(new_size) resampled_img = resampler.Execute(image) return resampled_img if __name__ == "__main__": img_after_resampling = resample_image('path_to_your_medical_image.nii') sitk.WriteImage(img_after_resampling, 'resampled_output.nii') ``` 该脚本读取给定路径处存储的一个三维体素文件(.nii),并按照自定义的新spacing对其进行重新采样保存至另一位置。注意这里假设输入为NIfTI格式的MRI/CT等类型的医疗影像资料。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值