ADNI数据预处理-dcm2nii批量处理

处理医学影像数据,dicom2nii是我们经常会遇到的问题。在利用公开数据集ADNI的数据时,我们可以直接下载nii格式的数据,但是MPRAGE和fMRI数据不在一个空间位置,甚至相差很远,在一个可见的情况下(MPRAGE),另一个数据不可见(fMRI)。如果用这样的数据将fMRI 配准到MPRAGE,会因为overlap太小而报错。
图1,直接从ADNI上面下载nii格式的数据所遇到的困境,MPRAGE与fMRI数据空间上相差太远,无法做registration。
因为dicom数据是正常的,所以我们决定下载dicom数据。又因为很多数据后处理方法(例如SPM,ANTR )都是基于nii格式的,所以将数据转换为nii是必要的。
SPM+matlab 可以做到批量完成dcm2nii,普通的数据转换都挺正常的,但是ADNI的数据依旧出问题,不是说没有位置信息就是参数不对。如果某个数据有幸转换成功,依旧是一个奇奇怪怪的图(图2)。
图2,SPM dcm2nii处理所遇到的问题
因此我们辗转找到一个利用mricron 中dcm2nii完成这个工作的方案。并且因为需要批量操作 ,所以我在虚拟机linux下面部署了这个工作。过程很复杂,安装软件mricron 的方案已经有了很棒的方案可以用。我只介绍利用shell 批量处理的代码,需要用到shell 变量,shell 文件操作,dcm2nii 命令行这三个知识来完成批量处理。下面是具体的代码:

  1. 定义dicom的路径和希望存储nii的路径变量
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.定义变量等号两边不要有空格.

  1. for 循环对每个数据进行处理。
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数据,两者在同一个空间位置。
图3, A:Mricron dcm2nii和SPM dcm2nii处理结果对比;B:Mricron dcm2nii 处理MPRAGE和fMRI 结果

猜你喜欢

转载自blog.csdn.net/weixin_37724055/article/details/106390196