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=origin−direction∗spacing∗dims
这个表达式看起来就是点的平移公式。
# -*- 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)