将DICOM数据读入单元阵列的性能问题

Man*_*noj 5 matlab image-processing matrix cell dicom

我需要读取4000个或更多DICOM文件。我编写了以下代码来读取文件并将数据存储到单元格数组中,以便稍后进行处理。一个DICOM文件包含128 * 931数据。但是,一旦我执行了代码,就花费了超过55分钟的时间来完成迭代。有人可以向我指出以下代码的性能问题吗?

% read the file information form the disk to memory
readFile=dir('d:\images','*.dcm');

for i=1:4000

   % Read the information form the dicom files in to arrays

   data{i}=dicomread(readFile(i).name);
   info{i}=dicominfo(readFile(i).name);

   data_double{i}=double(data{1,i}); % convert 16 bit data into double
   first_chip{i}=data_double{1,i}(1:129,1:129); % extracting first chip data into an array

end
Run Code Online (Sandbox Code Playgroud)

Cri*_*ngo 4

您正在将 128*931*4000 像素读入内存(假设 16 位值,接近 1 GB),将其转换为双精度 (4 GB) 并提取一个区域 (129*129*4000*8 = 0.5 GB)。您保留了所有这三个副本,这是一个可怕的数据量!尝试不要保留所有数据:

readFile = dir('d:\images','*.dcm');
first_chip = cell(size(readFile));
info = cell(size(readFile));
for ii = 1:numel(readFile)
   info{ii} = dicominfo(readFile(ii).name);
   data = dicomread(info{ii});
   data = (1:129,1:129); % extracting first chip data
   first_chip{ii} = double(data); % convert 16 bit data into double
end
Run Code Online (Sandbox Code Playgroud)

在这里,我预先分配了first_chip和数组info。如果不这样做,每次添加元素时都会重新分配数组,从而导致昂贵的副本。我还首先提取了 ROI,然后转换为双倍,正如 Rahul 在他的回答中所建议的那样。最后,我重新使用 DICOM 信息结构来读取文件。我不知道这是否会对速度产生很大影响,但它节省了该dicomread功能的一些精力

但请注意,这个过程仍然需要相当长的时间。读取 DICOM 文件很复杂并且需要时间。我建议您一次将它们全部读取,然后将first_chipinfo元胞数组保存到 MAT 文件中,这样以后读入会快得多。

  • 难道你不能使用“fgetl”来使用“fscanf”来只读取所需的位,例如txt/bin/csv等文件吗?预分配还允许您使用“parfor”,如 Rahul 建议的那样,如果您不预分配 iirc,则该方法不起作用。它可能会加快速度,具体取决于计算步骤(大概是“双倍”)还是磁盘读取速度是问题。 (2认同)
  • @Adriaan:这是一种复杂的文件格式,我不太了解内部结构,无法推荐类似的东西。“dicomread”允许指定从卷图像中读取哪些平面,但这似乎不适用于此处。 (2认同)