fMRI数据处理:从DICOM到NIFTI(下)

系列文章目录

fMRI数据处理:从DICOM到NIFTI(上)
fMRI数据处理:从DICOM到NIFTI(中)
fMRI数据处理:从DICOM到NIFTI(下)
fMRI数据处理:图像质量控制


前言

上一篇我们完成了对原始DICOM的数据整理,将其整理为了BIDS目录结构。作为从从DICOM到NIFTI的最后一篇,当然是介绍如何批量将DICOM格式转NIFTI格式啦!


一、批量DICOM转NIFTI

1.MRIcorn + python(Windows系统)

其实MRIcorn的转格式,是一个单独的程序,叫dcm2niix.exe,它就在你安装MRIcorn路径下的Resources文件夹里。
在这里插入图片描述
在dcm2niix.exe目录下右键打开命令行窗口,然后输入dcm2niix.exe回车,就会看见详细的使用说明。(我右键菜单栏怎么没有这个选项呀?当然,这是需要单独设置的)

你也可以按win+r输入cmd回车,首先输入dcm2niix所在的盘符,再输入cd空格路径,例如我的dcm2niix在D:\Program Files\MRIcron\Resources下,那就先输入D:回车,在输入cd D:\Program Files\MRIcron\Resources回车,进入到dcm2niix的路径下,最后输入dcm2niix.exe回车。在这里插入图片描述
这段使用帮助的最后几行告诉我们,可以通过命令行的方式进行转换,这样就摆脱了MRIcorn的图形界面,点来点去,加上循环语句就可以批处理了。那么第一步就是要安装python,如果你会就可以跳过,如果你不会,那就去b站搜索一下。这里推荐安装python最原始的安装包和vscode编辑器。vscode如何设置python环境建议百度一下,不麻烦,点点点就完事(还是告诉你吧,安装好vscode后,从扩展中搜索python安装就行,看不懂界面的话可以再搜索安装中文扩展。

代码如下(示例,需要修改的地方包括:

  • sys.path.append——为你本地MRIcron安装目录下的Resources文件夹路径;
  • dist_dir——为dcm2niix.exe的路径
  • root_path——为你自己项目的根目录
  • 最后range(1,2)跑一个被试看看,没问题再改为(2,xx)
import os
import sys
import subprocess
sys.path.append(r'D:\Program Files\MRIcron\Resources')# 添加dcm2niix.exe到系统path
dist_dir = r'D:\Program Files\MRIcron\Resources\dcm2niix.exe'# 定义dcm2niix.exe的路径
root_path = r'E:\postgraduate\fMRIanalysis\demo'# 你自己项目的根目录
dicom_path = root_path + "/data/dicom"# dicom文件目录
bids_path = root_path + "/data/bids"# bids目录
if not os.path.exists(bids_path):# 如果bids文件夹不存在,则创建一个
    os.mkdir(bids_path)

def single_subject(sub_id):# 不用补零,sub-01就输入1
    subject = "sub-{0:02d}".format(sub_id)# 被试编号补齐2位,如果是1,则补成01;过百就修改为{0:03d}
    sub_path = dicom_path + '/' + subject# 设置被试dicom文件路径
    for ii in os.listdir(sub_path):# 遍历sub-xx下的类型,如anat、func
        data_dir1 = sub_path + '/' + ii
        for iii in os.listdir(data_dir1):# 遍历func下多个run
            data_dir2 = data_dir1 + '/' + iii
            output_dir = bids_path + '/' + subject + '/' + ii
            if ii == 'anat':# 当数据为anat时,命名为sub-xx_T1w.nii
                filename = subject + '_' + iii
            elif ii == 'func':# 当数据为anat时,命名为sub-xx_task_run-x.nii
                filename = subject + '_task_' + iii
            output_folder = os.path.join(bids_path, subject, ii)
            if not os.path.exists(output_dir):
                os.makedirs(output_folder)
            os.system('chcp 65001')
            command = [dist_dir, '-o', output_dir, '-f', filename, '-b', 'y', data_dir2]
            subprocess.run(command, check=True)

for i in range(1,30):# range(1,30)是从1开始,到29结束
    single_subject(i)

2.Heudiconv(Linux系统)

Heudiconv是Linux系统下的一个软件,它可以批处理将DICOM文件转为NIFTI文件,还可以自动为你输出符合BIDS目录结构的数据(可以说非常的省心呢~,但是前提你要会Linux)

首先贴一个Heudiconv的官网,我只能说大概讲述一下如何使用,并且还是在我自己的需求基础上,更多的需求可以去爬官方文档,啃英文。

首先,我用的是Ubuntu 20.04LTS系统版本,然后用docker来运行的Heudiconv,其版本是v1.0.1,刚刚看了一下都更新到v1.1.3了,还有就是它可能会出现bug(之前更新最新版本的时候,莫名其妙日期元信息报错,论坛提问发现是个bug,下个版本才修复,但是数据又得处理,没办法只好回旧版本)

首先,先别慌跑批处理,第一步进入到container里,看看路径挂载对了没有,cd base 然后 ls 一下看看有没有数据,如果正常,那么恭喜你:

# Step1: check the path in container then cd base/data for check; exit
docker run -it --rm \
-v /media/xxx/B0EA93B7EAxxxx/postgraduate/fMRIanalysis:/base \
--entrypoint=bash \
nipy/heudiconv:1.0.1

第二步也别急,我知道你很急,但你先别急,这一步会生成一个启发式文件,用于转换完格式后,自动输出为BIDS格式用的。文件名为heuristic.py,打开它,需要修改的。

# Step2: generate heuristic file for one subject
docker run --rm -it \
-v /media/xxx/B0EA93B7EAxxxx/postgraduate/fMRIanalysis:/base \
nipy/heudiconv:1.0.1 \
-d /base/data/dicom/sub-{subject}/*/* \
-o /base/data/bids\
-f convertall \
-s 001 \
-c none \
--overwrite
# heuristic file where needed to rewrite
def infotodict(
    seqinfo: list[SeqInfo],
) -> dict[tuple[str, tuple[str, ...], None], list[str]]:
    """Heuristic evaluator for determining which runs belong where

    allowed template fields - follow python string module:

    item: index within category
    subject: participant id
    seqitem: run number during scanning
    subindex: sub index within group
    """

    t1w = create_key('sub-{subject}/anat/sub-{subject}_T1w') # 这一行要改,是T1w的文件命名规则,不会改就直接搬这个
    task = create_key('sub-{subject}/func/sub-{subject}_task_run-{item:01d}_bold') # 这一行要改,是func的文件命名规则,不会改就直接搬
    info = {t1w: [], task: []}
    last_run = len(seqinfo)

    for s in seqinfo:
        """
        The namedtuple `s` contains the following fields:

        * total_files_till_now
        * example_dcm_file
        * series_id
        * dcm_dir_name
        * unspecified2
        * unspecified3
        * dim1
        * dim2
        * dim3
        * dim4
        * TR
        * TE
        * protocol_name
        * is_motion_corrected
        * is_derived
        * patient_id
        * study_description
        * referring_physician_name
        * series_description
        * image_type
        """
        # 下面四行也得该,意思就是176就是结构像,大于176就是功能像,只是因为我的数据是这样
        if (s.dim3 == 176):
            info[t1w].append(s.series_id)
        if (s.dim3 > 176):
            info[task].append(s.series_id)
    return info

修改完启发式,我知道你很急,但你还是现别急,接下来先跑一个被试看看结果对不对,别一顿跑完,发生启发式错误,输出的文件目录结构一塌糊涂!

# Step3: run with edited heuristic file for one subject
docker run --rm -it \
-v /media/xxx/B0EA93B7EAxxxx/postgraduate/fMRIanalysis:/base \
nipy/heudiconv:1.0.1 \
-d /base/data/dicom/sub-{subject}/*/* \
-o /base/data/bids\
-f /base/code/preprocessing/heuristic.py \
-s 001 \
-c dcm2niix -b \
--overwrite

# Step4: loop all subject
for sub in `seq -w 002 010`
do
docker run --rm -it \
-v /media/xxx/B0EA93B7EAxxxx/postgraduate/fMRIanalysis:/base \
nipy/heudiconv:1.0.1 \
-d /base/data/dicom/sub-{subject}/*/* \
-o /base/data/bids\
-f /base/code/preprocessing/heuristic.py \
-s $sub \
-c dcm2niix -b \
--overwrite
done

我知道短短这些内容,很难讲清楚,但是!网上也有教程,我觉得写的还挺好的,也提供给大家参考~
当然官方网站提供了下载,安装,使用教程,以及常见问题,如果你的问题得不到解决,我推荐你爬官方文档。因为其他的文档都是依据旧版本写的,所以很多地方看着不太一样,这需要你自己去寻找答案。
第一篇:官方教程
第二篇:斯坦福大学Heudicov教程
第三篇:国内知乎教程1国内知乎教程2

3.AFNI(Linux系统)

其实,都用上Linux系统了,还有什么软件不能批处理转格式呢是吧,但是我想也不是每个人都会所有的软件,还是写上吧,因为我用AFNI比其他软件多一些。下面这段代码就是转换单个NIFTI文件的代码,还差循环和整理输出格式,困了,先鸽掉,会不会补就再说啦~

root_dir=/media/xxx/B0EA93B7Exxxxxxx/postgraduate/fMRIanalysis
subj=01
dicom_dir=$top_dir/data/dicom/sub-$subj/anat
bids_dir=$top_dir/data/bids/sub-$subj/anat
cd $dicom_dir

uniq_images I*[0123456789] > uniq_image_list.txt

Dimon -infile_list uniq_image_list.txt     \
      -gert_create_dataset                 \
      -gert_write_as_nifti                 \
      -gert_to3d_prefix sub-${subj}_T1w   \
      -gert_outdir $bids_dir              \
      -dicom_org                           \
      -use_last_elem                       \
      -save_details Dimon.details          \
      -use_obl_origin                      \
      -gert_quit_on_err


总结

从DICOM到NIFTI系列就完成啦!撒花★,°:.☆( ̄▽ ̄)/$:.°★
从核磁机器把数据拷回来——到整理成BIDS格式——到批量转格式;我们fMRI数据处理的第一步就算是正式迈出去啦!
接下来的内容,敬请期待吧~

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值