Dicom批量转nii(医学影像格式转换,SPM)

Dicom批量转nii(医学影像格式转换,SPM)

实验中需要用spm12进行配准,spm12 配准只能导入nii格式,但影像是dicom格式的,需要先进行格式转换。

spm12有自带的dicom转nii功能,但需要一例一例影像转,费时费力枯燥,好在基于SPM12可以写代码进行批量转换!

 

1. 在matlab上安装好spm12,安装方法可参考smp12官网

2. 文件组织方式

    Dicom批量转nii(医学影像格式转换,SPM)_第1张图片

    dicom path:

              保存所有dicom的目录,该目录下是一个一个的病例,每个病例的影像分开保存;

              每个病例有多个序列的话,每个序列的dicom再分别用文件夹保存。

    nii path:

              保存格式转化后nii的目录,该目录下是一个一个的病例,每个病例的影像分开保存;

              每个病例有多个序列的话,每个序列的nii再分别用文件夹保存。

    注:

            (一个序列有多个dicom;一个序列可能有多个,SPM12会自动给一个序列的多个nii命不同的名)

            (为方便批量处理,不同病例的同一序列需要统一文件夹命名)

            (nii path下的整个目录结构需要预先建立,可以写代码批量建立目录)

            (该代码没有处理序列文件夹下不是dicom的情况,需要序列文件夹下直接保存且仅保存该序列的dicom,否则,代码跑不通)

3. matlab代码

%-----------------------------------------------------------------------
% 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  
    

    

你可能感兴趣的:(医学成像相关)