1. 背景
之前都是用matlab的BrainNet Viewer做可视化的,无奈BNV的bug实在太多了,并且volume画出来脑区上还动不动出现黑边...需要一款替代软件
HWJ师兄推荐并教会了我了一款替代BNV的跨平台软件:HCP的Workbench (注意还是无须matlab的)
谢谢师兄~ 这里简单做个笔记
*需要Python以及numpy和nibabel包
*Workbench安装网站 https://www.humanconnectome.org/software/get-connectome-workbench
2. 效果
3. 核心步骤
-
在官网下载如下几个需要的文件
把的统计结果保存在一个数组里面,例如叫
data
运行如下python代码就能生成用于可视化的.dscalr.nii文件[注意后缀一定是.dscalr.nii]
import nibabel as nib
import numpy as np
import os
filename = '***' # 生成的XXX.dscalar.nii文件的路径
atlas_file='***' # fsaverage.BN_Atlas.32k_fs_LR.dlabel.nii这个文件的路径
atlas=nib.load(atlas_file)
atlas_data=atlas.get_fdata()
new_data=np.zeros(atlas_data.shape)
new_data[new_data==0]=np.nan
for i in range(1,211,2):
new_data[atlas_data==i]=data[i-1]
for i in range(212,421,2):
new_data[atlas_data==i]=data[i-211]
scalar_axis=nib.cifti2.cifti2_axes.ScalarAxis(['val'])
brain_model_axis=atlas.header.get_axis(1)
val_head=nib.cifti2.Cifti2Header.from_axes((scalar_axis,brain_model_axis))
cifti=nib.cifti2.cifti2.Cifti2Image(new_data,val_head,atlas.nifti_header,atlas.extra,atlas.file_map)
nib.save(cifti,filename)
- 在workbench里面导入文件(open file)软件会自动实时出图
首先同时导入
然后导入刚才python代码生成的XXX.dscalar.nii文件
你应该就可以看到最开始的效果,接下来就是一些官方文档告诉你的修图保存步骤了
还可以在软件里进行colorbar等常规设置,非常方便流畅,不同平台上软件界面会不同
一些进阶代码
1. 批量把保存在txt中的结果转换成dscalar文件
为了方便直接从命令行批量生成某一个目录下的txt,例如 % python3 txt_to_dscalar.py draw_txt/txt draw_txt/dscalr
from genericpath import exists
import nibabel as nib
import numpy as np
import os
import sys
path_txt = sys.argv[1] + "/"
path_save = sys.argv[2] + "/"
if not (os.path.exists(path_save)):
os.makedirs(path_save)
atas_bna = nib.load('Workbench/fsaverage.BN_Atlas.32k_fs_LR.dlabel.nii')
def read_single_file(filepath):
with open(filepath) as file:
lines = file.readlines()
lines = [line.rstrip() for line in lines]
data = list(map(float, lines))
return(data)
def save_array_as_dscalar_bna_246(data, filename, atlas = atas_bna):
atlas_data=atlas.get_fdata()
new_data=np.zeros(atlas_data.shape)
new_data[new_data==0]=np.nan
for i in range(1,211,2):
new_data[atlas_data==i]=data[i-1]
for i in range(212,421,2):
new_data[atlas_data==i]=data[i-211]
scalar_axis=nib.cifti2.cifti2_axes.ScalarAxis(['val'])
brain_model_axis=atlas.header.get_axis(1)
val_head=nib.cifti2.Cifti2Header.from_axes((scalar_axis,brain_model_axis))
cifti=nib.cifti2.cifti2.Cifti2Image(new_data,val_head,atlas.nifti_header,atlas.extra,atlas.file_map)
nib.save(cifti,filename)
for filename in os.listdir(path_txt):
if(filename.endswith('.txt')):
print(filename)
data = read_single_file(path_txt + filename)
save_array_as_dscalar_bna_246(data, path_save + filename[:-len('.txt')] + '.dscalar.nii')