ITK学习笔记(七) ITK旋转方向位置不变

ITK学习笔记(七) ITK旋转方向位置不变

sitk使用的使LPS坐标系,与slicer中使用的RAS坐标系不同。
在sitk中的方向 ( 1 , 1 , 1 ) (1,1,1) (1,1,1),在slicer中的方向是 ( − 1 , − 1 , 1 ) (-1,-1,1) (1,1,1)
如果要将图像,通过sitk将sitk下方向 ( − 1 , − 1 , 1 ) (-1,-1,1) (1,1,1) 改为 ( 1 , 1 , 1 ) (1,1,1) (1,1,1), 即将slicer下方向 ( 1 , 1 , 1 ) (1,1,1) (1,1,1)改为 ( − 1 , − 1 , 1 ) (-1,-1,1) (1,1,1).
需要的操作:修改方向属性,修改原点,在sitk下将方向 ( − 1 , − 1 , 1 ) (-1,-1,1) (1,1,1) 改为 ( 1 , 1 , 1 ) (1,1,1) (1,1,1) 后,数据需要镜像,原点需要修改,原点修改为:
n e w O r i g i n = o r i g i n − d i r e c t i o n ∗ s p a c i n g ∗ d i m s newOrigin = origin - direction * spacing * dims newOrigin=origindirectionspacingdims
这个表达式看起来就是点的平移公式。

# -*- coding : UTF-8 -*-
# @file   : resample_change_direction.py
# @Time   : 2022-02-14 16:19
# @Author : wmz
import os
import numpy as np
import SimpleITK as sitk


def getFiles(path, suffix):
    return [os.path.join(root, file) for root, dirs, files in os.walk(path) for file in files if file.endswith(suffix)]


def resampleVolume(outspacing, vol):
    """
    将体数据重采样的指定的spacing大小\n
    paras:
    outpacing:指定的spacing,例如[1,1,1]
    vol:sitk读取的image信息,这里是体数据\n
    return:重采样后的数据
    """
    outsize = [0, 0, 0]
    # 读取文件的size和spacing信息
    inputsize = vol.GetSize()
    inputspacing = vol.GetSpacing()

    transform = sitk.Transform()
    transform.SetIdentity()
    # 计算改变spacing后的size,用物理尺寸/体素的大小
    outsize[0] = round(inputsize[0] * inputspacing[0] / outspacing[0])
    outsize[1] = round(inputsize[1] * inputspacing[1] / outspacing[1])
    outsize[2] = round(inputsize[2] * inputspacing[2] / outspacing[2])

    # 设定重采样的一些参数
    resampler = sitk.ResampleImageFilter()
    resampler.SetTransform(transform)
    resampler.SetInterpolator(sitk.sitkLinear)
    resampler.SetOutputOrigin(vol.GetOrigin())
    resampler.SetOutputSpacing(outspacing)
    resampler.SetOutputDirection(vol.GetDirection())
    resampler.SetSize(outsize)
    newvol = resampler.Execute(vol)
    return newvol


def resample_direction(itk_img, direction=tuple([1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0])):
    """
        将体数据重采样的指定的spacing大小\n
        paras:
        outpacing:指定的spacing,例如[1,1,1]
        vol:sitk读取的image信息,这里是体数据\n
        return:重采样后的数据
    """
    outsize = [0, 0, 0]
    # 读取文件的size和spacing信息
    img_size = itk_img.GetSize()
    spacing = itk_img.GetSpacing()

    transform = sitk.Transform()
    transform.SetIdentity()
    # 计算改变spacing后的size,用物理尺寸/体素的大小
    outsize[0] = round(img_size[0])
    outsize[1] = round(img_size[1])
    outsize[2] = round(img_size[2])
    origin = itk_img.GetOrigin()
    new_origin = tuple([origin[0] - spacing[0] * img_size[0], origin[1] - spacing[1] * img_size[1], origin[2]])

    # 设定重采样的一些参数
    resampler = sitk.ResampleImageFilter()
    # resampler.SetReferenceImage(itk_img)
    resampler.SetTransform(transform)
    resampler.SetInterpolator(sitk.sitkLinear)
    resampler.SetSize(outsize)
    resampler.SetOutputOrigin(new_origin)
    resampler.SetOutputDirection(direction)
    resampler.SetOutputSpacing(spacing)
    new_img = resampler.Execute(itk_img)
    out_arr = sitk.GetArrayFromImage(new_img)
    return new_img


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)


if __name__ == '__main__':
    img_fath = r"D:\Dataset\landmark\Data_train_scaled_2"
    filelist = getFiles(img_fath, "nii.gz")
    dst_path = r"D:\Dataset\landmark\resample_direction_train"

    for imgfile in filelist:
        org_img = sitk.Image(sitk.ReadImage(imgfile))
        direct = org_img.GetDirection()
        direction = tuple([1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0])
        spacing = org_img.GetSpacing()
        img_size = org_img.GetSize()
        img_arr = sitk.GetArrayFromImage(org_img)
        out_img = resample_direction(org_img, direction)
        # out_img = resample_image(org_img, spacing, direction)
        # out_img = sitk.GetImageFromArray(sitk.GetArrayFromImage(org_img))
        # out_arr = sitk.GetArrayFromImage(out_img)
        # out_arr = np.flip(out_arr, [1, 2])
        # out_img = sitk.GetImageFromArray(out_arr)
        # # setup other image characteristics
        # origin = org_img.GetOrigin()
        # new_origin = tuple([origin[0] - spacing[0] * img_size[0], origin[1] - spacing[1] * img_size[1], origin[2]])
        # # out_img.SetOrigin(org_img.GetOrigin())
        # out_img.SetOrigin(new_origin)
        # out_img.SetSpacing(org_img.GetSpacing())
        # set to RAI
        out_img.SetDirection(tuple([1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]))

        out_arr = sitk.GetArrayFromImage(out_img)
        dst_file = os.path.join(dst_path, imgfile.rsplit("\\")[-1])
        sitk.WriteImage(out_img, dst_file)
        print("saved file: ", dst_file)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值