Support:Documents:Examples: Reslicing using COMKAT image tool (advanced)
Estimation of Physiological Parameters Using a Physiologically Based Model
Overview
To evaluate glucose transport and phosphorylation in skeletal muscle, a physiologically based model has been proposed by our group. Herein, we show an example of implementation of the proposed model using COMKAT software. In particular, the below example shows the implementation of the proposed model for a phosphorylatable glucose analog (e.g. 18F-labeled 2-fluoro-2-deoxy-D-glucose).
Overview22
The above figure shows the kinetics of [18F]2FDG in skeletal muscle. The model has three tissue compartments with five rate constants.
The first compartment is the interstitial concentration of [18F]2FDG .
The second compartment is the intracellular concentration of [18F]2FDG .
The third compartment is the intracellular concentration of [18F]2FDG-6-P .
Rate constants k1 and k2 describe the passive exchange of the glucose analog between plasma and interstitial space.
Rate constants k3a and k4a describe the inward and backward transport of the glucose analog via glucose transporters.
Rate constant k5a describe the phosphorylation of the intracellular glucose analog catalyzed by hexokinase.
COMKAT Implementation of the Physiologically Based Model
Create a new model
function outputVolume = fcnReSlice(GUI_handles, a_row, a_column, a_plane, flagUseCurrIvd) %%*****************************************************************************************%% % Example: Using ImageVolumeData::sliceVolume() to reslice 3D images % e.g. % outputVolume = fcnReSlice(GUI_handles [, a_row, a_column, a_plane, flagUseCurrIvd]); % % Parameters - % GUI_handles : GUI handles obtained from comkatimagetool % a_row : Desired aspect ratio in row direction (default: 1.0) % a_column : Desired aspect ratio in colume direction (default: 1.0) % a_plane : Desired aspect ratio in plane direction (default: 1.0) % flagUseCurrIvd : A flag to control the data used to reslice % ( 1: Current COMKAT ImageVolumeData (default), 0: Original) % outputVolume : Resliced 3D volume images % % % Dylan Su 2012-07-30 % kuan-hao.su@case.edu %%*****************************************************************************************%% %% Obtain the imageVolumeData object from GUI_handles ivd = GUI_handles.imageVolumeData{1}; % assume PET is image 1 if nargin == 1, a_row = 1; a_column = 1; a_plane = 1; end if nargin < 5, flagUseCurrIvd = 1; % 1: use current COMKAT image volume end if (~flagUseCurrIvd), %% Get the information from origianl data positionInput = get(ivd,'ImagePositionPatient'); orientationInput = get(ivd,'ImageOrientationPatient'); pixelSpacing = get(ivd, 'PixelSpacing'); [nr, nc, np, ~] = get(ivd, 'VolumeDimension'); nrows = nr; ncols = nc; nplanes = np; else %% Get the information from current COMKAT imageVolumeData idxSA = 1; % get infor from short axis (SA) view positionInput = GUI_handles.view{idxSA}.position{1}; orientationInput = GUI_handles.view{idxSA}.orientation{1}; pixelSpacing = repmat( GUI_handles.view{idxSA}.pixelSpacing(1),[1,3]); nrows = GUI_handles.rows; ncols = GUI_handles.columns; [~, ~, np, ~] = get(ivd, 'VolumeDimension'); pixelSpacingOrg = get(ivd, 'PixelSpacing'); nplanes = ceil(np * pixelSpacingOrg(3) / pixelSpacing(3)); end %% Calculate the desired dimension dnrows = ceil(nrows * a_row); dncols = ceil(ncols * a_column); dnplanes = ceil(nplanes * a_plane); % calcualte new pixelSpacing by preserving the original FOV size pixelSpacing = pixelSpacing ./ [dnrows/nrows, dncols/ncols, dnplanes/nplanes]; %% Set the scale and offset the same as the original volume % use same scale and offset for subvolume as original volume % 0 = scaledPixel = rawPixel * s + o --> rawPixel = -o/s; s = get(ivd, 'VolumeFrameBufferScaleFactor'); o = get(ivd, 'VolumeFrameBufferRescaleIntercept'); rawBackgroundPixelValue = -o/s; %% Determine location of first pixel in output volume posSA = positionInput; % xyz of the center of first pixel if (~flagUseCurrIvd), % for subject's data, 'posSA' is the center of the first pixel position = posSA; else % for imageVolumeData, 'posSA' is the center of the folume position = posSA - orientationInput(:,3) * (dnplanes * pixelSpacing(3)) / 2; end planePosStep = orientationInput(:,3) * pixelSpacing(3); % calculate the step of new plane position %% Build output volume plane-by-plane outputVolume = zeros(dnrows, dncols, dnplanes); % initialize the output images for idxP = 1 : dnplanes, planePos = position + (idxP - 1) * planePosStep; % position of plane to be interpolated % determine indicies in original volume corresponding to xyz physical (mm) location of plane [u, v, w] = coordinateGen(ivd, ... dncols, dnrows, pixelSpacing, planePos, orientationInput); % obtain a slice by interpolating from the ivd volumeFrameBuffer fprintf('plane ==> %i/%i\n', idxP, dnplanes); outputVolume(:, :, idxP) = sliceVolume(ivd, v , u , w, rawBackgroundPixelValue,'linear'); end