You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PyVista从NIfTI文件提取数组并对比MRI差异

处理NIfTI MRI差异可视化的PyVista实现方案

1. 依赖安装

先确保安装所需库:

pip install nibabel numpy pyvista

2. 完整流程代码示例

步骤1:读取NIfTI文件并调整数组轴顺序

NIfTI默认轴顺序为(z,y,x),而PyVista采用(x,y,z)坐标系,需转置数组匹配:

import nibabel as nib
import numpy as np
import pyvista as pv

# 读取两个MRI文件
img1 = nib.load('mri1.nii')
img2 = nib.load('mri2.nii')

# 提取数组并转置轴顺序
arr1 = np.transpose(np.array(img1.dataobj), (2, 1, 0))
arr2 = np.transpose(np.array(img2.dataobj), (2, 1, 0))

步骤2:计算差异数组

通过绝对差异+阈值过滤噪声,聚焦有效变化:

# 计算绝对差异
diff_arr = np.abs(arr1 - arr2)

# 阈值化(根据数据调整阈值,过滤微小噪声)
threshold = 10
diff_arr[diff_arr < threshold] = 0

步骤3:转换为PyVista可处理的网格结构

将差异数组转为UniformGrid,并从NIfTI的affine矩阵提取体素间距,保证显示比例正确:

# 从affine矩阵获取体素间距
affine = img1.affine
spacing = np.array([affine[0,0], affine[1,1], affine[2,2]])

# 创建UniformGrid并添加差异数据
grid = pv.UniformGrid()
grid.dimensions = arr1.shape
grid.spacing = spacing
grid['Difference'] = diff_arr.flatten(order='F')  # 用Fortran顺序展平数组

步骤4:可视化差异

叠加原始MRI或单独显示差异,通过颜色映射高亮变化:

plotter = pv.Plotter()

# 可选:添加原始MRI作为背景(灰度显示)
# grid_original = pv.UniformGrid()
# grid_original.dimensions = arr1.shape
# grid_original.spacing = spacing
# grid_original['Intensity'] = arr1.flatten(order='F')
# plotter.add_volume(grid_original, opacity='linear', cmap='gray', opacity_unit_distance=spacing[0])

# 添加差异体积,用彩色映射高亮变化
plotter.add_volume(grid, cmap='jet', opacity='sigmoid', show_scalar_bar=True, scalar_bar_title='MRI Difference')

# 设置等轴测视角并显示
plotter.camera_position = 'iso'
plotter.show()

3. 关键注意事项

  • 轴顺序匹配:必须转置数组,否则3D显示会出现方向偏移。
  • 体素间距:从affine提取spacing是保证可视化比例正确的核心。
  • 阈值调整:根据你的MRI数据噪声水平调整阈值,避免无关小差异干扰。
  • 透明度模式:sigmoid透明度模式能让差异区域更突出,同时保留背景可见性。

内容的提问来源于stack exchange,提问作者lucasgoddamn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:45:38