使用Workbench对基于BNA246模板的统计结果进行surface可视化

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. 核心步骤

  1. 在官网下载如下几个需要的文件


    BN那个是师兄帮我生成的= =
  2. 把的统计结果保存在一个数组里面,例如叫data

  3. 运行如下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)
  1. 在workbench里面导入文件(open file)软件会自动实时出图

首先同时导入

image.png

然后导入刚才python代码生成的XXX.dscalar.nii文件

你应该就可以看到最开始的效果,接下来就是一些官方文档告诉你的修图保存步骤了

还可以在软件里进行colorbar等常规设置,非常方便流畅,不同平台上软件界面会不同

点击每个layer里的进行设置

一些进阶代码

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')

你可能感兴趣的:(使用Workbench对基于BNA246模板的统计结果进行surface可视化)