Operating system: Windows 10
Slicer version: 4.11.0
Expected behavior: Find IJK coordinates of ROI
Actual behavior: I get negative or bigger than dimensions IJK coordinates
Dear slicers,
I am trying to get iMin, iMax, jMin, jMax, kMin, kMax from some Annotation ROI using a MATLAB bridge module such that
ROI = Volume[iMin:iMax,jMin:jMax,kMin:kMax] and then I will perform some analysis on the ROI on MATLAB.
I have created a MATLAB module thanks to MATLAB bridge to get IJK coordinates of an ROI.
Inputs of module
- ROI
- Volume (to get ijkToLpsTransform…)
Outputs
- IJK coordinates so ROI = Volume(iMin:iMax,jMin:jMax,kMin:kMax)
I based my code on 2 MATLAB bridge module examples :
- FillAroundSeeds : https://github.com/PerkLab/SlicerMatlabBridge/tree/master/Examples/FillAroundSeeds
- MatlabBridgeParameterPassingTest : https://github.com/PerkLab/SlicerMatlabBridge/tree/master/Examples/MatlabBridgeParameterPassingTest
Here is my code
function outputParams=ijkROI(inputParams)
% returns ijk coordinates of Annotation ROI
% Parameters:
% inputParams.region: ROI
% inputParams.inputvolume: input volume
% outputParams.stringCoordinates: coordinates of ROI as string 'iMin:iMax,jMin:jMax,kMin:kMax'
imageValue = cli_imageread(inputParams.inputImage);
regionValue = cli_pointvectordecode(inputParams.region);
[~, regionCount] = size(regionValue);
% only one ROI
assert(regionCount==1)
regionIndex = 1;
% get center of ROI and radius
radius_LPS = [regionValue(4:6,regionIndex); 0];
% radius_IJK = abs(round(imageValue.ijkToLpsTransform\radius_LPS));
radius_IJK = ceil(abs(imageValue.ijkToLpsTransform\radius_LPS));
center_LPS = [regionValue(1:3,regionIndex); 1];
center_IJK = round(imageValue.ijkToLpsTransform\center_LPS);
% get coordinates of ROI
ROIijk = [center_IJK(1)-radius_IJK(1),...
center_IJK(1)+radius_IJK(1),...
center_IJK(2)-radius_IJK(2),...
center_IJK(2)+radius_IJK(2),...
center_IJK(3)-radius_IJK(3),...
center_IJK(3)+radius_IJK(3)];
% assert coordinates are not outside input volume
volumeSize = size(imageValue.pixelData);
% assert((ROIijk(1) > 1) & (ROIijk(3) > 1) & (ROIijk(5) > 1))
% assert((ROIijk(2) < volumeSize(1)) & (ROIijk(4) < volumeSize(2)) & (ROIijk(6) < volumeSize(3)))
% Write outputs
outputParams.stringCoordinates = sprintf('%d:%d,%d:%d,%d:%d',ROIijk(1),ROIijk(2),ROIijk(3),ROIijk(4),ROIijk(5),ROIijk(6));
I have tried it with a random Annotation ROI inside MRHead volume.
The center given by regionValue = cli_pointvectordecode(inputParams.region) is consistent with coordinates of center in Red, Green and Yellow slices in user’s interface.
Yet radius is bigger than expected and I get negative coordinates or coordinates bigger than dimension.
Any idea why the ijkToLpsTransform gives results outside the ROI ?
Thank you very much