Difference between revisions of "Support:Documents:Examples: Reslicing using COMKAT image tool (advanced)"
Line 20: | Line 20: | ||
Send the GUI handles of COMKAT image tool to MATLAB workspace. | Send the GUI handles of COMKAT image tool to MATLAB workspace. | ||
− | + | [Image:Example Reslice 1.jpg] | |
Revision as of 19:42, 8 August 2012
Reslicing 3D image volume using COMKAT image tool (advanced)
Overview
In the advanced 3D slicing using COMKAT image tool, we’re going to describe a slicing approach assisted by using the user-graphical-interface of COMKAT image tool.
A function for slicing is provided as an example to show the interaction method between the COMKAT GUI and slicing functions.
Background
If you are not familiar with the approach of using coordinateGen() and sliceVolume(), you may find more details in the page, 3D Slicing using COMKAT Image Tool (basic)
Use COMKAT image tool to do the image processing
Load a file using COMKAT image tool and use the functions to translate and rotate the image volume as you desire.
Send the handles to workspace
Send the GUI handles of COMKAT image tool to MATLAB workspace.
[Image:Example Reslice 1.jpg]
Create the function for reslicing
Create following MATLAB function:
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
Use the function to reslice the image volume
Then, you can reslice the volume data with this function.
e.g. outputVolume = fcnReSlice( GUI_handles ); The ’outputVolume‘ is the resliced 3D volume.
Or you may input the desired aspect ratios in each direction to vary the sampled resolutions of the resliced images.
e.g. outputVolume = fcnReSlice( GUI_handles , 1.0, 1.0, 2.0); In this case, the number of sampling in the plane-direction would be doubled.
If you’d like to reslice the image volume from original image data without pre-sampling, translation and rotation, you may set the fifth parameter to zero.
e.g. outputVolume = fcnReSlice( GUI_handles , 1.0, 1.0, 2.0, 0); So now the ‘outputVolume’ is the resliced volume of the original data.