parfor with temporary variable worning

2 visualizaciones (últimos 30 días)
wonjoong cheon
wonjoong cheon el 24 de Nov. de 2022
Comentada: wonjoong cheon el 25 de Nov. de 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

Respuesta aceptada

Edric Ellis
Edric Ellis el 24 de Nov. de 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 comentarios
Walter Roberson
Walter Roberson el 25 de Nov. de 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;
wonjoong cheon
wonjoong cheon el 25 de Nov. de 2022
Dear Walter Roberson
IT IS DONE.
Great skill from the level 10 MVP.
Best regards.

Iniciar sesión para comentar.

Más respuestas (1)

Walter Roberson
Walter Roberson el 24 de Nov. de 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.

Categorías

Más información sobre Parallel for-Loops (parfor) en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by