mwgeurts / dicom_tools

DICOM manipulation tools for MATLAB
GNU General Public License v3.0
39 stars 19 forks source link

Superimpose RTCT and RTDose #24

Open wjcheon opened 1 year ago

wjcheon commented 1 year ago

Dear mwheurts,

First of all, I am a big fan of you :)

I have a quesntion, I have read RT image and RT dose by using your codes.

The shape of RTCT is [ 512, 512, 131] and RTDose is [201, 101, 131].

I want to fusion or superimpose RTDOSE to RTCT with size of [512 512 131]

Please, any advice.

and I hope to see you someday as offline.

Best regards

Wonjoong Cheon,

wjcheon commented 1 year ago

` function [outputArg1] = doseRegiste2CT(varargin) %UNTITLED3 Summary of this function goes here % Detailed explanation goes here

if size(varargin{2}.data,1) ~= size(varargin{1}.data,1) ... || size(varargin{2}.data,2) ~= size(varargin{1}.data,2) ... || size(varargin{2}.data,3) ~= size(varargin{1}.data,3) ... || isequal(varargin{2}.width, varargin{1}.width) == 0 ... || isequal(varargin{2}.start, varargin{1}.start) == 0

% Create 3D mesh for reference image
[refX, refY, refZ] = meshgrid(single(varargin{1}.start(2) + ...
    varargin{1}.width(2) * (size(varargin{1}.data,2) - 1): ...
    -varargin{1}.width(2):varargin{1}.start(2)), single(varargin{1}.start(1): ...
    varargin{1}.width(1):varargin{1}.start(1) + varargin{1}.width(1)...
    * (size(varargin{1}.data,1) - 1)), single(varargin{1}.start(3):...
    varargin{1}.width(3):varargin{1}.start(3) + varargin{1}.width(3)...
    * (size(varargin{1}.data,3) - 1)));

% Create GPU 3D mesh for secondary dataset
[secX, secY, secZ] = meshgrid(single(varargin{2}.start(2) + ...
    varargin{2}.width(2) * (size(varargin{2}.data,2) - 1):...
    -varargin{2}.width(2):varargin{2}.start(2)), single(varargin{2}.start(1): ...
    varargin{2}.width(1):varargin{2}.start(1) + varargin{2}.width(1) ...
    * (size(varargin{2}.data,1) - 1)), single(varargin{2}.start(3):...
    varargin{2}.width(3):varargin{2}.start(3) + varargin{2}.width(3) ...
    * (size(varargin{2}.data,3) - 1)));

% Attempt to use GPU to interpolate dose to image/structure
% coordinate system.  If a GPU compatible device is not
% available, any errors will be caught and CPU interpolation
% will be used instead.
try
    % Initialize and clear GPU memory
    gpuDevice(1);

    % Interpolate the dose to the reference coordinates using
    % GPU linear interpolation, and store back to
    % varargin{2}.data
    varargin{2}.data = gather(interp3(gpuArray(secX), ...
        gpuArray(secY), gpuArray(secZ), ...
        gpuArray(varargin{2}.data), gpuArray(refX), ...
        gpuArray(refY), gpuArray(refZ), 'linear', 0));

    % Clear GPU memory
    gpuDevice(1);

    % Catch any errors that occured and attempt CPU interpolation
    % instead
catch
    % Interpolate the dose to the reference coordinates using
    % linear interpolation, and store back to varargin{2}.data
    varargin{2}.data = interp3(secX, secY, secZ, ...
        varargin{2}.data, refX, refY, refZ, '*linear', 0);
end

% Clear temporary variables
clear refX refY refZ secX secY secZ;

end

outputArg1 = varargin{2}.data;

end `

I have solved the problem ! I got a hint from your other codes.

mwgeurts commented 1 year ago
Hi Wonjoong, Great to hear! I’m also happy to see you are finding value in this code. Kind regards, Mark   Sent from Mail for Windows From: WonjoongCheonSent: Thursday, December 15, 2022 4:11 AMTo: mwgeurts/dicom_toolsCc: SubscribedSubject: Re: [mwgeurts/dicom_tools] Superimpose RTCT and RTDose (Issue #24) `function [outputArg1] = doseRegiste2CT(varargin)%UNTITLED3 Summary of this function goes here% Detailed explanation goes hereif size(varargin{2}.data,1) ~= size(varargin{1}.data,1) ...|| size(varargin{2}.data,2) ~= size(varargin{1}.data,2) ...|| size(varargin{2}.data,3) ~= size(varargin{1}.data,3) ...|| isequal(varargin{2}.width, varargin{1}.width) == 0 ...|| isequal(varargin{2}.start, varargin{1}.start) == 0% Create 3D mesh for reference image[refX, refY, refZ] = meshgrid(single(varargin{1}.start(2) + ...    varargin{1}.width(2) * (size(varargin{1}.data,2) - 1): ...    -varargin{1}.width(2):varargin{1}.start(2)), single(varargin{1}.start(1): ...    varargin{1}.width(1):varargin{1}.start(1) + varargin{1}.width(1)...    * (size(varargin{1}.data,1) - 1)), single(varargin{1}.start(3):...    varargin{1}.width(3):varargin{1}.start(3) + varargin{1}.width(3)...    * (size(varargin{1}.data,3) - 1))); % Create GPU 3D mesh for secondary dataset[secX, secY, secZ] = meshgrid(single(varargin{2}.start(2) + ...    varargin{2}.width(2) * (size(varargin{2}.data,2) - 1):...    -varargin{2}.width(2):varargin{2}.start(2)), single(varargin{2}.start(1): ...    varargin{2}.width(1):varargin{2}.start(1) + varargin{2}.width(1) ...    * (size(varargin{2}.data,1) - 1)), single(varargin{2}.start(3):...    varargin{2}.width(3):varargin{2}.start(3) + varargin{2}.width(3) ...    * (size(varargin{2}.data,3) - 1))); % Attempt to use GPU to interpolate dose to image/structure% coordinate system.  If a GPU compatible device is not% available, any errors will be caught and CPU interpolation% will be used instead.try    % Initialize and clear GPU memory    gpuDevice(1);     % Interpolate the dose to the reference coordinates using    % GPU linear interpolation, and store back to    % varargin{2}.data    varargin{2}.data = gather(interp3(gpuArray(secX), ...        gpuArray(secY), gpuArray(secZ), ...        gpuArray(varargin{2}.data), gpuArray(refX), ...        gpuArray(refY), gpuArray(refZ), 'linear', 0));     % Clear GPU memory    gpuDevice(1);     % Catch any errors that occured and attempt CPU interpolation    % insteadcatch    % Interpolate the dose to the reference coordinates using    % linear interpolation, and store back to varargin{2}.data    varargin{2}.data = interp3(secX, secY, secZ, ...        varargin{2}.data, refX, refY, refZ, '*linear', 0);end % Clear temporary variablesclear refX refY refZ secX secY secZ;endoutputArg1 = varargin{2}.data;end`I have solved the problem ! I got a hint from your other codes.—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you are subscribed to this thread.Message ID: ***@***.***>