nii.gz 文件
.nii.gz 文件通常是医学影像数据的一种常见格式,比如神经影像(如脑部MRI)。这种文件格式通常是经过gzip压缩的NIfTI格式(Neuroimaging Informatics Technology Initiative)。
要在Python中查看.nii.gz文件,你可以使用一些专门的库,如Nibabel(NiBabel是用于读取和写入神经影像数据的Python库)和SimpleITK(SimpleITK是一个用于医学影像处理的库)。
Nibabel
安装
$ pip install nibabel
使用
一、可视化
import nibabel as nib
import matplotlib.pyplot as plt
import seaborn as sns
import os
sns.set_style('darkgrid')
img1_path = './testData/test.nii.gz'
img = nib.load(img1_path)
# 获取图像数据
data = img.get_fdata()
# 可视化每一层切片
num_slices = data.shape[-1]
# 设置子图的行数和列数
num_rows = num_slices // 10 + 1 # 每行显示10个切片
num_cols = min(num_slices, 10)
# 设置子图的大小
fig, axes = plt.subplots(num_rows, num_cols, figsize=(15, 15))
# 遍历每一层切片并可视化
for i in range(num_slices):
row_idx = i // 10
col_idx = i % 10
# 在子图中显示每一层切片
axes[row_idx, col_idx].imshow(data[:, :, i], cmap='gray')
axes[row_idx, col_idx].axis('off') # 关闭坐标轴
# 如果切片数量不是10的倍数,隐藏多余的子图
for i in range(num_slices, num_rows * num_cols):
row_idx = i // 10
col_idx = i % 10
fig.delaxes(axes[row_idx, col_idx])
plt.show()
运行结果
二、读取参数
img1_path = './testData/test.nii.gz'
# 读取图像
img1_obj = nib.load(img1_path)
print(f'Type of the image {type(img1_obj)}')
# 提取 numpy 数组
img1_data = img1_obj.get_fdata()
# 查看图像大小
height, width, depth = img1_data.shape
print(f"The image object height: {height}, width:{width}, depth:{depth}")
# 查看图像值范围
print(f'image value range: [{img1_data.min()}, {img1_data.max()}]')
# 查看图像成像信息,如 层厚,平面(in-plane)分辨率等
# 矩阵以外的信息可以通过 image_obj.header 获取
# header是键值对,查看 header 包含的所有信息
print('headers', img1_obj.header.keys())
# 查看成像信息
pixdim = img1_obj.header['pixdim']
print(f'z轴分辨率: {pixdim[3]}')
print(f'in plane 分辨率: {pixdim[1]} * {pixdim[2]}')
x_range = pixdim[1] * height
y_range = pixdim[2] * width
z_range = pixdim[3] * depth
print(f"The image object x_range: {x_range}, y_range:{y_range}, z_range:{z_range}")
# 整个数据
print('img1_obj', img1_obj)
含义
image_obj.header.keys()
返回头部信息的键值列表。这些键值对应于头部信息的不同字段。下面是一些常见的键和它们的含义,这可能因数据集和图像类型而有所不同:
-
'sizeof_hdr'
:- 头部结构的大小(以字节为单位)。
-
'data_type'
:- 数据类型的字符串描述。
-
'db_name'
:- 数据库名称。
-
'extents'
:- 数据文件中图像数据之外的额外信息的长度(以字节为单位)。
-
'session_error'
:- 与会话错误相关的信息。
-
'regular'
:- 表示数据是否按照正则网格排列。
-
'dim_info'
:- 与维度信息相关的标志。
-
'dim'
:- 包含数据维度信息的列表,通常是三个值,表示 x、y 和 z 方向上的体素数目。
-
'intent_p1', 'intent_p2', 'intent_p3'
:- 有关数据意图的一些参数。
-
'intent_code'
:- 数据意图的代码。
-
'datatype'
:- 数据的存储类型,如
DT_UINT16
、DT_FLOAT32
等。
- 数据的存储类型,如
-
'bitpix'
:- 每个像素的位数。
-
'slice_start'
:- 切片的起始位置。
-
'pixdim'
:- 包含像素的尺寸信息的列表,通常是三个值,表示 x、y 和 z 方向上的像素大小。
-
'vox_offset'
:- 图像数据的偏移位置。
-
'scl_slope', 'scl_inter'
:- 缩放和截距参数,用于将原始像素值转换为实际的物理值。
-
'slice_end'
:- 切片的结束位置。
-
'slice_code'
:- 切片的编码方式。
-
'xyzt_units'
:- 数据单位的标志。
-
'cal_max', 'cal_min'
:- 校准最大和最小值。
-
'slice_duration'
:- 切片的持续时间。
-
'toffset'
:- 用于时间偏移的参数。
-
'descrip'
:- 描述信息。
-
'aux_file'
:- 辅助文件名。
- 辅助文件名。
-
'qform_code', 'sform_code'
:- 用于定义坐标系的代码。
-
'quatern_b', 'quatern_c', 'quatern_d'
:- 用于定义仿射矩阵的参数。
-
'qoffset_x', 'qoffset_y', 'qoffset_z'
:- 用于定义坐标系原点的参数。
-
'srow_x', 'srow_y', 'srow_z'
:- 用于定义仿射矩阵的行。
-
'intent_name'
:- 数据意图的名称。
-
'magic'
:- 文件的 “magic” 字符串,用于标识文件类型。
这只是头部信息中的一些常见字段,具体的含义可能会因数据集和图像类型而有所不同。你可以使用这些键来访问特定的头部信息,例如 image_obj.header['dim']
可以获取数据的维度信息。
img.affine
是一个属性,它返回图像数据的仿射矩阵(Affine Matrix)。仿射矩阵是一个线性变换矩阵,用于将体素坐标映射到物理空间坐标。在神经影像学中,物理空间坐标通常与实际的解剖结构或空间位置相关联。
具体来说,仿射矩阵由以下形式的矩阵表示:
其中:
- Rij表示旋转和缩放的元素。
- Ti表示平移的元素。
这个仿射矩阵允许将体素坐标 ((i, j, k)) 映射到物理空间坐标 ((x, y, z))。具体地说,对于一个三维体素坐标 ((i, j, k)),物理空间坐标 ((x, y, z)) 的计算方式如下:
在 nibabel
中,img.affine
提供了访问这个仿射矩阵的方式,使得用户可以将图像中的体素坐标映射到物理空间坐标,或者反过来。这对于将图像与现实世界中的解剖结构相对应非常有用。
成像
功能性磁共振成像(fMRI)利用 BOLD(Blood Oxygen Level Dependent)信号进行成像。BOLD信号是一种血氧水平依赖信号,与血液中的氧含量有关。这种信号成为fMRI的基础,用于测量脑活动。
fMRI中的BOLD信号的产生基于以下原理:
-
神经活动和代谢变化: 当某个脑区域活跃时,该区域的神经细胞消耗氧气并产生代谢产物。这导致局部的血液氧含量下降。
-
血流调节: 大脑对血流进行动态调节,以满足活跃区域的能量需求。当某个区域活跃时,局部血流会增加,带来更多富含氧气的血液。
-
BOLD信号: 富含氧气的血液和贫含氧气的血液对磁场的影响不同。在fMRI中,主要测量局部脑区域血氧水平的变化,这反映了脑活动的变化。
通过检测BOLD信号的变化,fMRI可以提供关于脑活动的空间和时间分辨率相对较高的图像。研究人员可以使用fMRI来研究任务激活、静息状态下的脑网络、疾病状态等。fMRI成像已成为神经科学和认知神经科学研究的常见工具。
NIfTI 文件中每个层切片的成像原理主要利用了图像中每个位置的像素值。NIfTI 文件是一种神经影像数据格式,包含了三维或四维(包括时间信息)图像数据。每个图像体素(Voxel)在文件中都有一个对应的像素值,这个值表示该体素在成像中的强度或其他特定属性。(应该是 BOLD)
具体来说,对于结构磁共振成像(sMRI)或功能性磁共振成像(fMRI)等数据,每个像素值通常表示相应体素的信号强度。这些像素值经过图像采集和处理,反映了成像区域内的解剖结构、脑活动等信息。