首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中以Nifti格式编辑并保存3D体积的体素大小和对应的仿射?

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

Stack Overflow用户
提问于 2019-04-20 22:53:55
回答 1查看 1.2K关注 0票数 1

我正在改变一些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函数。这怎么能成为一个案例?

如何显式更改体素大小?

EN

回答 1

Stack Overflow用户

发布于 2019-12-09 05:41:54

我现在也面临着类似的问题。为了解决这个问题,我从头开始创建了一个nifti头,它有0.5 mm的各向同性体素和所需的形状。可以使用header.set_zooms()以毫米为单位设置体素大小。

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55774677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档