Search code examples
matlabimage-processingmatrixdicom

how to resolve index exceeds matrix dimensions in matlab?


I am trying to read series of dicom images from a folder named as series 8.below is code to read series of dicom images from a particular folder.i am getting error index exceeds matrix dimensions at info = dicominfo(fullfile(fileFolder,fileNames{1})).

clear all;
close all;
clc;
fileFolder = fullfile(pwd, 'series 8');
files = dir ( fullfile (fileFolder, '*.dcm'));
fileNames = {files.name};

%examine file header (metadata , from dicom stack)

info = dicominfo(fullfile(fileFolder,fileNames{1}))

%extract size info from metadata
voxelsize = [info.PixelSpacing;info.SliceThickness];

%read one file to get size
I = dicomread(fullfile(fileFolder,fileNames{1}))
classI = class(I);
sizeI = size(I);
numImages = length(fileNames);

%read slice images populate 3d matrix
hWaitBar = waitbar(0,'reading dicom files');

%create array
mri= zeroes(info.rows , info.columns , numImages , classI )
for i=length(fileNames):-1:1
    fname = fullfile(fileFolder, fileNames{i});
    mri(:,:,i) = unit16(dicomread(fname));
    waitbar((length(fileNames)-i+1)/length(fileNames))
end

delete(hWaitBar);

Solution

  • Below two options that will do it. In the first you create a loop around your whole approach and as filenames is zero when there is no dcm file the loop will not get executed. The second option tests whether files is empty and if so it is not executed.

    clear all;
    close all;
    clc;
    fileFolder = fullfile(pwd, 'series 8');
    files = dir ( fullfile (fileFolder, '*.dcm'));
    fileNames = {files.name};
    
    %examine file header (metadata , from dicom stack)
    
    for i=length(fileNames):-1:1
       if (i == 1)
           info = dicominfo(fullfile(fileFolder,fileNames{i}));
    
           %extract size info from metadata
           voxelsize = [info.PixelSpacing;info.SliceThickness];
    
           %read one file to get size
           I = dicomread(fullfile(fileFolder,fileNames{i}));
           classI = class(I);
           sizeI = size(I);
           numImages = length(fileNames);
    
           %read slice images populate 3d matrix
           hWaitBar = waitbar(0,'reading dicom files');
    
           %create array
           mri= zeroes(info.rows , info.columns , numImages , classI );
       else
           fname = fullfile(fileFolder, fileNames{i});
           mri(:,:,i) = unit16(dicomread(fname));
           waitbar((length(fileNames)-i+1)/length(fileNames))
       end
    end
    delete(hWaitBar);
    

    the second

    clear all;
    close all;
    clc;
    fileFolder = fullfile(pwd, 'series 8');
    files = dir ( fullfile (fileFolder, '*.dcm'));
    fileNames = {files.name};
    
    %examine file header (metadata , from dicom stack)
    if ~isempty(files)
        info = dicominfo(fullfile(fileFolder,fileNames{1}))
    
        %extract size info from metadata
        voxelsize = [info.PixelSpacing;info.SliceThickness];
    
        %read one file to get size
        I = dicomread(fullfile(fileFolder,fileNames{1}))
        classI = class(I);
        sizeI = size(I);
        numImages = length(fileNames);
    
        %read slice images populate 3d matrix
        hWaitBar = waitbar(0,'reading dicom files');
    
        %create array
        mri= zeroes(info.rows , info.columns , numImages , classI )
        for i=length(fileNames):-1:1
            fname = fullfile(fileFolder, fileNames{i});
            mri(:,:,i) = unit16(dicomread(fname));
            waitbar((length(fileNames)-i+1)/length(fileNames))
        end
    
        delete(hWaitBar);
    end