引言
默写情况下,dcm文件导出后虽然名字为1001.dcm,1002.dcm,…,但是并非连续的,1002.dcm可能是第10层,为了后续后处理,前期可以将dcm文件序号和层数对应上
代码如下:
clc;clear;close all;
%%
patients = dir('data_czey/Y*');
for ii = 1:numel(patients) % 遍历病人
patientname = patients(ii).name;
disp(['-----------------',patientname,'-----------------']) % 显示处理病人ID号
dcmnames=dir(['data_czey/',patientname,'/*.DCM']); % 列出该病人下所有dcm文件
N_dcm=numel(dcmnames);
% DCM = zeros(512,512,N_dcm); % 重新排序图像所用的矩阵
IDX = zeros(1,N_dcm); % 重新排序图像所用的索引
for jj=1:N_dcm
dcmname=dcmnames(jj).name;
filefullpath=fullfile('data_czey',patientname,dcmname);
% DCM(:,:,jj) = dicomread(filefullpath); % 存储图像矩阵
info = dicominfo(filefullpath);
IDX(jj) = info.SliceLocation; % 存储SliceLocation,用于排序
end
[~,idx] = sort(IDX,'descend'); % 根据存储SliceLocation排序,idx为排序后index
for kk = 1:N_dcm
index=sprintf('1%03d',kk); % 输出1001.dcm格式
% disp([index,'->',num2str(N_dcm+1-kk+1000)]); % 输出辅助信息:变换后对应之前的index
disp([dcmnames(idx(kk)).name,'->',index]); % 输出辅助信息:输出前index->输出后index,配合ImageJ对应序号
filesrc = ['data_czey/',patientname,'/',dcmnames(idx(kk)).name]; % 复制前的文件名
outputpath=fullfile('data_czey_sort2',patientname); % 复制后的文件名所在文件夹
if ~exist(outputpath,'file') % 不存在则创建
mkdir(outputpath)
end
% fileold = [outputpath,'/',num2str(N_dcm+1-kk+1000),'.dcm']; % 复制前的文件名
fileout = [outputpath,'/',index,'.dcm']; % 复制前的文件名
copyfile(filesrc,fileout) % 复制(前面有重命名)
end
end