我正在更改某些 3D 体积的体素大小。如何编辑pixdim
字段并计算新affine
?
我有一些各向异性的MR体积,体素大小是0.5 x 0.5 x 3
毫米。我有一些代码将它们插值到各向同性(如0.5 x 0.5 x 0.5
毫米体素大小)体积中。 问题是当我需要保存文件时,我必须计算仿射以映射 ijk 空间中现在更密集的体素以引用 xyz 空间。我该怎么做?
首先,我的想法是使用旧的仿射并计算新的仿射。
例如,如果体积 V 具有0.5 x 0.5 x 3
体素大小的256 x 256 x 20
体素形状,并插值到体积 U256 x 256 x 120
体素大小为0.5 x 0.5 x 0.5
的体素。
旧的仿射可以[255 255 19]OA = [X Y Z]
,新的仿射应该做[255 255 119]NA = [X Y Z]
我们知道AX=B X=inverse(A)B
。
所以新的仿射应该是inverse([255 255 119])[X Y Z]
的. 但是,逆矩阵仅存在于方阵中。不会有inverse([255 255 119])
这样的事情.
而且似乎在python-nibabel matlab-nifti-toolbox中没有set_voxel_size
函数。这是怎么回事?
如何显式更改体素大小?
我现在面临类似的问题。为了解决这个问题,我从头开始创建一个具有 0.5 毫米各向同性体素和所需形状的 nifti 标头。您可以使用header.set_zooms()
以毫米为单位设置体素大小。
import nibabel as nib
import numpy as np
hdr = nib.Nifti1Header()
hdr.set_data_shape((256, 256, 120))
hdr.set_zooms((0.5, 0.5, 0.5)) # set voxel size
hdr.set_xyzt_units(2) # millimeters
dst_aff = hdr.get_best_affine()
src_aff = np.eye(4)
src_aff_inv = np.linalg.inv(src_aff)
transform = np.matmul(src_aff_inv, dst_aff)