一 最近在进行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