实验中需要用spm12进行配准,spm12 配准只能导入nii格式,但影像是dicom格式的,需要先进行格式转换。
spm12有自带的dicom转nii功能,但需要一例一例影像转,费时费力枯燥,好在基于SPM12可以写代码进行批量转换!
dicom path:
保存所有dicom的目录,该目录下是一个一个的病例,每个病例的影像分开保存;
每个病例有多个序列的话,每个序列的dicom再分别用文件夹保存。
nii path:
保存格式转化后nii的目录,该目录下是一个一个的病例,每个病例的影像分开保存;
每个病例有多个序列的话,每个序列的nii再分别用文件夹保存。
注:
(一个序列有多个dicom;一个序列可能有多个,SPM12会自动给一个序列的多个nii命不同的名)
(为方便批量处理,不同病例的同一序列需要统一文件夹命名)
(nii path下的整个目录结构需要预先建立,可以写代码批量建立目录)
(该代码没有处理序列文件夹下不是dicom的情况,需要序列文件夹下直接保存且仅保存该序列的dicom,否则,代码跑不通)
%-----------------------------------------------------------------------
% Job saved on 21-Nov-2019 15:35:09 by cfg_util (rev $Rev: 7345 $)
% spm SPM - SPM12 (7487)
% cfg_basicio BasicIO - Unknown
% 用于批量 dicom 转 nii
%-----------------------------------------------------------------------
clc
spm('defaults', 'fmri');
spm_jobman('initcfg');
subjectsdir = {'E:\dicom_path'}; % dicom文件夹的位置,该目录下是一个个病例文件夹
path = 'E:\nii_path'; % 需要整理的病例列表
subjects = dir(path); % 将各病例文件夹名存为list
subjects = {subjects.name}; % 单个或多个被试的文件夹
subjects(:,[1,2]) = [];
dicom_dir = 'T1'; % 哪个序列的dicom被转为nii
nsubj = length(subjects); % 病例个数
% 遍历所有case
for csubj = 1:nsubj
modality_list = {spm_select('CPath', subjects{csubj}, subjectsdir)};
modality = spm_select('CPath', dicom_dir, modality_list);
if exist(modality,'dir')==0 % 如果该case没有该序列文件夹,跳过该case,处理下一个case
sprintf('No %s found for %s', dicom_dir, subjects{csubj})
continue
end
dicom_list = spm_select('List', modality, '/*.dcm'); %该序列dicom名数组,如'1.dcm',指定后缀为dcm
%dicom_list = spm_select('List', modality, '/*.'); % 该序列文件夹下的所有文件,如'IM1''1.dcm',不指定后缀
nimage = size(dicom_list,1); % 该序列dicom张数,如果张数为0,跳过该序列
if nimage == 0
sprintf('No functional file found for %s', subjects{csubj})
continue
end
% 各dicom名前加上文件夹路径名,如'E:\dicom_path\case3\T1\1.dicom'
new_list = cell(nimage, 1);
for i = 1:nimage
new_list{i} = fullfile(modality,dicom_list(i,:));
end
clear matlabbatch
out_p = fullfile(path, subjects{csubj}, dicom_dir); % nii的保存路径
matlabbatch{1}.spm.util.import.dicom.data = new_list;
matlabbatch{1}.spm.util.import.dicom.root = 'flat';
matlabbatch{1}.spm.util.import.dicom.outdir = {out_p};
matlabbatch{1}.spm.util.import.dicom.protfilter = '.*';
matlabbatch{1}.spm.util.import.dicom.convopts.format = 'nii';
matlabbatch{1}.spm.util.import.dicom.convopts.meta = 0;
matlabbatch{1}.spm.util.import.dicom.convopts.icedims = 0;
% 运行
spm_jobman('run', matlabbatch);
end