Coordinate System Conversion Between ITK and Slicer3

From NAMIC Wiki
Revision as of 00:39, 23 March 2007 by Vmagnotta (talk | contribs)
Jump to: navigation, search
Home < Coordinate System Conversion Between ITK and Slicer3

The coordinate systems used in ITK and Slicer3 are different. Internally in Slicer3 a transform is built that converts from an ijk pixel index into a RAS coordinate system. This is extracted from the image using the Direction Cosines that can be extracted from an ITK image with the GetDirection() method. A problem for the meshing programs (solid and surface based meshes) is that we need to extract the correct RAS system coordinate system for the node locations. A reasonable simple way to handle this is to use the OrientedImage image type in ITK. However the Direction Cosines are for an LPS coordinate system and thus we need to convert the Direction Cosines to place place the image into a RAS coordinate system. Based on the code from the OrientImageFilter in ITK, a conversion of the Direction Cosines to RAS was designed that will allow all of the coordinate transforms to be handled internally in the OrientedImage Get


 ImageType::DirectionType imageDir = image->GetDirection( );
 ImageType::PointType origin = image->GetOrigin( );
 
 int dominantAxisRL = itk::Function::Max3(imageDir[0][0],imageDir[1][0],imageDir[2][0]);
 int signRL = itk::Function::Sign(imageDir[dominantAxisRL][0]);
 int dominantAxisAP = itk::Function::Max3(imageDir[0][1],imageDir[1][1],imageDir[2][1]);
 int signAP = itk::Function::Sign(imageDir[dominantAxisAP][1]);
 int dominantAxisSI = itk::Function::Max3(imageDir[0][2],imageDir[1][2],imageDir[2][2]);
 int signSI = itk::Function::Sign(imageDir[dominantAxisSI][2]);
 
 ImageType::DirectionType DirectionToRAS;
 DirectionToRAS.SetIdentity( );
 
 if (signRL == 1)
   {
     DirectionToRAS[dominantAxisRL][dominantAxisRL] = -1.0; 
     origin[dominantAxisRL] *= -1.0;
   }
 if (signAP == -1)
   {
     DirectionToRAS[dominantAxisAP][dominantAxisAP] = -1.0; 
     origin[dominantAxisAP] *= -1.0;
   }
 if (signSI == 1)
   {
     DirectionToRAS[dominantAxisSI][dominantAxisSI] = -1.0; 
     origin[dominantAxisSI] *= -1.0;
   }
  
 imageDir *= DirectionToRAS;

 image->SetDirection( imageDir  );
 image->SetOrigin( origin );