[Insight-users] 3D Registration of two volumes
Aya El Gebeely
aya.elgebeely at symbyo.com
Sun Mar 7 10:31:21 EST 2010
Dear All,
I'm trying to register a 3D volume of a dental scan prosthesis to be mapped
on patient scan 3D volume, by taking landmarks from both the scan prosthesis
(moving image) and from the patient (fixed image), I've used
itk::VersorRigid3DTransform, where I get the translation and rotation from
the transform, after looping on each landmark and transform moving point to
fixed point..
The output transformation matrix does not map the two volumes correctly..
Taking into consideration that landMarks were taken from axial view of dicom
data, that 3D volume was generated from , also I've used Open Inventor
SbMatrix to initialize transformation 4*4 matrix
*Pipeline is as follow:*
typedef itk::VersorRigid3DTransform<double> TransformType;
TransformType::Pointer transform;
transform= TransformType::New();
typedef itk::LandmarkBasedTransformInitializer<
TransformType,FixedImageType, MovingImageType > TransformInitializerType;
TransformInitializerType::Pointer initializer;
initializer= TransformInitializerType::New();
TransformInitializerType::LandmarkPointContainer fixedLandmarks;
TransformInitializerType::LandmarkPointContainer movingLandmarks;
TransformInitializerType::LandmarkPointType m_point;
initializer->SetFixedLandmarks(fixedLandmarks);
initializer->SetMovingLandmarks(movingLandmarks);
initializer->SetTransform( transform );
initializer->InitializeTransform();
TransformInitializerType::PointsContainerConstIterator fitr =
fixedLandmarks.begin(); //Fixed points iterator
TransformInitializerType::PointsContainerConstIterator mitr =
movingLandmarks.begin();// Moving points iterator
typedef TransformInitializerType::OutputVectorType OutputVectorType;
while( mitr != movingLandmarks.end() )
{
transform->TransformPoint( *fitr );
++mitr;
++fitr;
}
OutputVectorType outputVec= transform->GetTranslation();
VersorType myversor= transform->GetVersor();
SbMatrix transformMatrix;
SbRotation rotation;
SbVec3f axis;
axis[0]=myversor.GetAxis()[0];
axis[1]=myversor.GetAxis()[1];
axis[2]=myversor.GetAxis()[2];
double x= myversor.GetScalar();
SbVec3f scaler;
scaler[0]=x;
scaler[1]=x;
scaler[2]=x;
rotation.setValue(axis,(float)(myversor.GetAngle()));
transformMatrix.setTransform(translation, rotation,scaler );
return transformMatrix;
I want to know if the problem from the pipeline, the input , the way I
initialize the output SbMatrix, or I'm using the wrong type of
registration..
Thanks a lot
Aya R.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20100307/03f3432f/attachment.htm>
More information about the Insight-users
mailing list