处理医学影像数据,dicom2nii是我们经常会遇到的问题。在利用公开数据集ADNI的数据时,我们可以直接下载nii格式的数据,但是MPRAGE和fMRI数据不在一个空间位置,甚至相差很远,在一个可见的情况下(MPRAGE),另一个数据不可见(fMRI)。如果用这样的数据将fMRI 配准到MPRAGE,会因为overlap太小而报错。
因为dicom数据是正常的,所以我们决定下载dicom数据。又因为很多数据后处理方法(例如SPM,ANTR )都是基于nii格式的,所以将数据转换为nii是必要的。
SPM+matlab 可以做到批量完成dcm2nii,普通的数据转换都挺正常的,但是ADNI的数据依旧出问题,不是说没有位置信息就是参数不对。如果某个数据有幸转换成功,依旧是一个奇奇怪怪的图(图2)。
因此我们辗转找到一个利用mricron 中dcm2nii完成这个工作的方案。并且因为需要批量操作 ,所以我在虚拟机linux下面部署了这个工作。过程很复杂,安装软件mricron 的方案已经有了很棒的方案可以用。我只介绍利用shell 批量处理的代码,需要用到shell 变量,shell 文件操作,dcm2nii 命令行这三个知识来完成批量处理。下面是具体的代码:
- 定义dicom的路径和希望存储nii的路径变量
1 2 | PATH_O="/mnt/hgfs/Cai/T1Raw/5-10" # dicom file path PATH_N="/mnt/hgfs/Cai/T1Img/5-10" # nii file path |
这里需要注意三点
a.不要把变量名设置成PATH,“PATH”是一个全局变量名,这样设置会使得m kdir 无法使用(报mkdir: no commend)错误;
b.定义变量不需要符号$;
c.定义变量等号两边不要有空格.
- for 循环对每个数据进行处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | for filename in /$PATH_O/* # list the dicom path do temp_O=$PATH_O/${filename##*/} #generate the dicom file name temp_N=$PATH_N/${filename##*/} #generate the nii file name #whether the nii dir existed or not if [ -d $temp_N ];then echo "existed,rm,mk" rm -d $temp_N #if existed, remove mkdir $temp_N #make new dir for nii else echo "not existed mk" mkdir $temp_N #file not existed, make new dir for nii fi dcm2nii -o $temp_N -i y $temp_O #dicom to nii command echo ${temp_N} is done! done # |
这里需要注意3点
a.shell 访问变量要用
,name;
b.{filename##*/}是shell的字符串操作,表示取最后一个/右边的字符,这里就是我要操作的dicom文件夹的相对路径,详见链接;
c.dcm2nii: -o outputname, -i y inputname。outputname代表生成nii文件的存储路径,inputname代表原始dcm文件夹路径。y代表压缩生成的nii文件(在terminals输入dcm2nii可以看到命令行的相关信息)。
Mricron dcm2nii处理结果与SPM dcm2nii处理结果对比如图3 A。Mricron dcm2nii处理的MPRAGE和fMRI结果展示如图3 B,相较于直接从ADNI网站上下载的nii数据,两者在同一个空间位置。