系列文章目录
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数据处理的第一步就算是正式迈出去啦!
接下来的内容,敬请期待吧~