如何在 python 中以 Nifti 格式编辑和保存体素大小和 3D 体积的相应仿射?



我正在更改某些 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)

相关内容

  • 没有找到相关文章

最新更新