使用Python对大脑成像数据进行可视化分析
以下文章来源于hackpython ,作者ayuliao
(由Python大本营付费下载自视觉中国)
作者 | ayuliao
出自 | hackpython (ID:hackpython)
import nibabel
# sM0223对应的文件
data_path = './fMRI_data/sM00223/'
files = os.listdir(data_path)
# 读取其中的数据
data_all = []
for data_file in files:
if data_file[-3:] == 'hdr':
data = nibabel.load(data_path + data_file).get_data()
# 打印数据维数
print(data.shape)
# -------结果
(256, 256, 54, 1)
体素:类似像素,像素表示的是二维图像的最小单位,而体素则用于三维成像空间。
import numpy as np
data = np.rot90(data.squeeze(), 1)
print(data.shape)
# -------结果
(256, 256, 54)
import matplotlib.pyplot as plt
# 创建 6 个子图,不清楚其中概念,可以看本公众号关于Matplotlib的文章
fig, ax = plt.subplots(1, 6, figsize=[18, 3])
n = 0
slice = 0
for _ in range(6):
ax[n].imshow(data[:, :, slice], 'gray')
ax[n].set_xticks([])
ax[n].set_yticks([])
ax[n].set_title('Slice number: {}'.format(slice), color='r')
n += 1
slice += 10
fig.subplots_adjust(wspace=0, hspace=0)
plt.show()
# fMRI数据的基本信息
x_size = 64
y_size = 64
n_slice = 64
n_volumes = 96
# 获得所有文件
data_path = './fMRI_data/fM00223/'
files = os.listdir(data_path)
# 读取数据并进行重塑
data_all = []
for data_file in files:
if data_file[-3:] == 'hdr':
data = nibabel.load(data_path + data_file).get_data()
# 将所有数据添加到list中,从而多了一个维度:时间维度
data_all.append(data.reshape(x_size, y_size, n_slice))
# 创建 3x6 的子图,大小为 18x11
fig, ax = plt.subplots(3, 6, figsize=[18, 11])
# 组织数据以冠状平面进行可视化,第四维度为时间维度,这里取第一个时间点
coronal = np.transpose(data_all, [1, 3, 2, 0])
coronal = np.rot90(coronal, 1)
# 组织数据以横切平面进行可视化
transversal = np.transpose(data_all, [2, 1, 3, 0])
transversal = np.rot90(transversal, 2)
# 组织数据以矢状平面进行可视化
sagittal = np.transpose(data_all, [2, 3, 1, 0])
sagittal = np.rot90(sagittal, 1)
# 可视化不同平面
n = 10
# 对每个切片的6个切面进行操作
for i in range(6):
ax[0][i].imshow(coronal[:, :, n, 0], cmap='gray')
ax[0][i].set_xticks([])
ax[0][i].set_yticks([])
if i == 0:
ax[0][i].set_ylabel('coronal', fontsize=25, color='r')
n += 10
n = 5
for i in range(6):
ax[1][i].imshow(transversal[:, :, n, 0], cmap='gray')
ax[1][i].set_xticks([])
ax[1][i].set_yticks([])
if i == 0:
ax[1][i].set_ylabel('transversal', fontsize=25, color='r')
n += 10
n = 5
for i in range(6):
ax[2][i].imshow(sagittal[:, :, n, 0], cmap='gray')
ax[2][i].set_xticks([])
ax[2][i].set_yticks([])
if i == 0:
ax[2][i].set_ylabel('sagittal', fontsize=25, color='r')
n += 10
fig.subplots_adjust(wspace=0, hspace=0)
plt.show()
◆
精彩推荐
◆
5大必知的图算法,附Python代码实现
如何用爬虫技术帮助孩子秒到心仪的幼儿园(基础篇)
Python传奇:30年崛起之路 2019年最新华为、BAT、美团、头条、滴滴面试题目及答案汇总
阿里巴巴杨群:高并发场景下Python的性能挑战