parfor with temporary variable worning
7 views (last 30 days)
Show older comments
wonjoong cheon
on 24 Nov 2022
Commented: wonjoong cheon
on 25 Nov 2022
I need expert's help.
I attached a code below:
The worning signal indicated "temp_info".
I want to stack CT images as a 3D volume.
But, position information of each slice is on the temp_info (loaded by dicominfo fn.)
I will handle few hundreds patient data.
Seriously, i need your help...
Best regards
Wonjoong Cheon
function [outputArg1] = dicomread3D(path_)
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
ct_list = dir(fullfile(path_, '*.dcm'));
num = length(ct_list);
temp_img_size = dicomread(fullfile(ct_list(1).folder, ct_list(1).name));
dcm_stack = zeros(temp_img_size(1), temp_img_size(2), num);
f = waitbar(0,'Please wait...');
parfor iter2 = 1: num
temp_img = dicomread(fullfile(ct_list(iter2).folder, ct_list(iter2).name));
temp_info = dicominfo(fullfile(ct_list(iter2).folder, ct_list(iter2).name));
ct_location = temp_info.InstanceNumber;
dcm_stack(:,:,ct_location) = temp_img;
waitbar(iter2/num, f, 'Load 3D medical images...');
end
close(f)
try
outputArg1 = (dcm_stack.*temp_info.RescaleSlope)+temp_info.RescaleIntercept;
catch
outputArg1 = dcm_stack;
disp('Rescale information is empty')
end
end
0 Comments
Accepted Answer
Edric Ellis
on 24 Nov 2022
I think there are a couple of problems here. Firstly, I think you need to change the way you're assigning into dcm_stack because as written, you are not satisfying the "sliced variable" requirement for a parfor loop output. I think you can fix this by storing an additional sliced output containing the the ct_location, I think you should apply the slope and intercept inside the parfor loop. Here's a sketch:
ct_list = dir(fullfile(path_, '*.dcm'));
num = length(ct_list);
temp_img_size = dicomread(fullfile(ct_list(1).folder, ct_list(1).name));
dcm_stack = zeros(temp_img_size(1), temp_img_size(2), num);
% Additional output for the parfor loop:
ct_locations = zeros(1, num);
parfor iter2 = 1: num
temp_img = dicomread(fullfile(ct_list(iter2).folder, ct_list(iter2).name));
temp_info = dicominfo(fullfile(ct_list(iter2).folder, ct_list(iter2).name));
% Store information from temp_info
ct_locations(iter2) = temp_info.InstanceNumber;
% Note we must store in stack indexed using "iter2":
dcm_stack(:,:,iter2) = (temp_img .* temp_info.RescaleSlope) + temp_info.RescaleIntercept;
end
% You can now re-order the "pages" in dcm_stack like this:
dcm_stack = dcm_stack(:,:,ct_locations);
7 Comments
Walter Roberson
on 25 Nov 2022
outputArg1 = (dcm_stackN.*temp_infomation .RescaleSlope)+temp_infomation .RescaleIntercept;
No, every file could have a different rescale slope and intercept (or not have the information.) You should be rescaling inside the parfor.
temp_img = dicomread(fullfile(ct_list(iter2).folder, ct_list(iter2).name));
temp_info = dicominfo(fullfile(ct_list(iter2).folder, ct_list(iter2).name));
sliceInfo(iter2) = temp_info.InstanceNumber;
if ~isfield(temp_info, 'RescaleSlope'); temp_info.RescaleSlope = 1; end
if ~isfield(temp_info, 'RescaleIntercept'); temp_info.RescaleIntercept = 0; end
dcm_stack(:,:,iter2) = (temp_img .* temp_info.RescaleSlope) + temp_info.RescaleIntercept;
More Answers (1)
Walter Roberson
on 24 Nov 2022
temp_info is assigned to inside the parfor in a way that is not indexed by the loop variable. parfor automatically makes it a temporary variable, and that means it cannot be used after the loop.
See Also
Categories
Find more on Parallel for-Loops (parfor) in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!