dicominfo returns an error on all dicom files other than one

8 ビュー (過去 30 日間)
sesilia maidelin
sesilia maidelin 2021 年 7 月 24 日
コメント済み: sesilia maidelin 2021 年 7 月 25 日
Hi all, i have a question. I'm writing some codes to read in the dicom tags of a series of dicom files. but somehow, dicominfo can only read the first data but returns an error on other data.
sourcedata = '/Users/.../dcmonly'
filesandfolders= dir([sourcedata '/**']);
%Plist = setdiff({ P_f([P_f.isdir]).name},{'.','..'});
all_list = {filesandfolders.name};
T = cell2table({});
for ii = 3: numel(all_list)
name = all_list{ii}
info(ii) = dicominfo(name);
s2det = [info.DistanceSourceToDetector];
s2pat = [info.DistanceSourceToPatient];
pixelspace = [info.ImagerPixelSpacing];
pixelsize = pixelspace * (s2det/s2pat);
Nf = 1/(2* pixelsize);
% write data to excel
T.s2det = s2det;
T.s2pat = s2pat;
T.pixelspace = pixelspace(1);
T.pixelsize = pixelsize(1);
T.Nf = Nf;
this is the error i got
Error using dicom_getFileDetails (line 14)
Unable to load file "00000018.dcm".
Error in dicominfo (line 55)
fileDetails = dicom_getFileDetails(filename);
Error in dicomtags (line 17)
info(ii) = dicominfo(name);
FYI the code after %write data to excel is pretty self explanatory, but i wanna append every info from other dicom files too in the sam excel file. i'm not sure how to go about this either. any help would be very much appreciated!


Simon Chan
Simon Chan 2021 年 7 月 25 日
Below shows some modification based on your code:
(1) Variable all_list is going to contain file names only, so that the index can start from 1 in the for loop
(2) Not indexing the varaible info so that it overwrites every time in the loop. You only needs to put the indexing unless you would like to record all information and process them later.
(3) Verify variable info.DistanceSourceToPatient is not zero in your case. Some vendor does not record this value and just put zero. If this is zero, you cannot calculate the pixel size later in the code
(4) info.PixelSpacing normally has two values, one for x and one for y-dimension. They are the same in most of the case but better to verify it by typing info.PixelSpacing to see both values. The following code take one dimension to calculate the pixelspace only (should be enough).
(5) Result for each dicom image is saved inside the loop and append in the array exceldata
(6) Write data to excel after finishing the loop
sourcedata = '/Users/.../dcmonly'; % Your working directory
filesandfolders= dir([sourcedata '/**']); % Read all files and folders
all_list = {filesandfolders(~[filesandfolders.isdir]).name}; % Retrieves files only
exceldata = []; % Initialize an empty array
for ii = 1: numel(all_list)
name = all_list{ii}; % Read the file name
info = dicominfo(name); % Retrieve the dicom header
s2det = info.DistanceSourceToDetector;
s2pat = info.DistanceSourceToPatient;
pixelspace = info.PixelSpacing(1);
pixelsize = pixelspace * (s2det./s2pat);
Nf = 1/(2* pixelsize);
exceldata = [exceldata; s2det s2pat pixelspace pixelsize Nf]; % Append the data
  8 件のコメント
sesilia maidelin
sesilia maidelin 2021 年 7 月 25 日
thank you so much! it works well now :)


その他の回答 (0 件)




Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by