我正在改变一些3D体积的体素大小。如何编辑pixdim
字段并计算新的affine
我有一些MR体积是各向异性的,体素大小是,比如说,0.5 x 0.5 x 3
mm。我有一些代码来将它们插入到各向同性(如0.5 x 0.5 x 0.5
mm体素大小)体积中。问题是当我需要保存文件时,我必须计算仿射来将ijk空间中现在更密集的体素映射到引用xyz空间。我该怎么做?
首先,我的想法是使用旧的仿射并计算新的仿射。
例如,如果体积V具有具有0.5 x 0.5 x 3
体素大小的256 x 256 x 20
体素的形状,并插值到具有0.5 x 0.5 x 0.5
体素大小的体积U 256 x 256 x 120
体素。
旧的仿射将做[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
函数。这怎么能成为一个案例?
如何显式更改体素大小?
发布于 2019-12-09 05:41:54
我现在也面临着类似的问题。为了解决这个问题,我从头开始创建了一个nifti头,它有0.5 mm的各向同性体素和所需的形状。可以使用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)
https://stackoverflow.com/questions/55774677
复制相似问题