[Insight-users] Using VersorRigid3DTransform

=?ks_c_5601-1987?B?vNW6uLyx?= bsson at scnj.co.kr
Thu Jun 3 01:41:28 EDT 2004


Dear ITK users,

 

I am trying to use ITK for a registration process.  Using VersorRigid3DTransform (itk:: VersorRigid3DTransform), a series of exam success, but other is fail. Source code is below...

=========== source start ===================

UINT ThreadStartRegistration(LPVOID infoIn)

{

             CMyDoc* pDoc = (CMyDoc*)infoIn;

             CMyView* pAutoView = pDoc->GetMyView();

             typedef float        InternalPixelType;

             typedef itk::Image<InternalPixelType,3>                    InternalImageType;

 

             typedef itk::VersorRigid3DTransform<double>                                                                            TransformType;

             typedef itk::VersorRigid3DTransformOptimizer                                                               OptimizerType;

             typedef itk::MattesMutualInformationImageToImageMetric<InternalImageType,InternalImageType>             MetricType;

             typedef itk::LinearInterpolateImageFunction<InternalImageType,double>         InterpolatorType;

             typedef itk::ImageRegistrationMethod<InternalImageType,InternalImageType>              RegistrationType;

 

             MetricType::Pointer         metric        = MetricType::New();

             OptimizerType::Pointer      optimizer     = OptimizerType::New();

             InterpolatorType::Pointer   interpolator  = InterpolatorType::New();

             RegistrationType::Pointer   registration  = RegistrationType::New();

             TransformType::Pointer                transform     = TransformType::New();

             

             unsigned long iNumSamples = 

                           pDoc->m_sizePrimary3DImage[0]*pDoc->m_sizePrimary3DImage[1]*pDoc->m_sizePrimary3DImage[2]*2/100; // 3 percentage of total pixels

             metric->SetNumberOfSpatialSamples(iNumSamples);

 

             registration->SetMetric(metric);

             registration->SetOptimizer(optimizer);

             registration->SetInterpolator(interpolator);

             registration->SetTransform( transform );

 

             typedef itk::NormalizeImageFilter<ImageType,InternalImageType> NormalizeFilterType;

             NormalizeFilterType::Pointer fixedNormalizer = NormalizeFilterType::New();

             NormalizeFilterType::Pointer movingNormalizer = NormalizeFilterType::New();

 

             fixedNormalizer->SetInput(pDoc->m_Primary3DImage.GetPointer());

             movingNormalizer->SetInput(pDoc->m_Secondary3DImage.GetPointer());

             

             registration->SetFixedImage(fixedNormalizer->GetOutput());

             registration->SetMovingImage(movingNormalizer->GetOutput());

 

             registration->SetFixedImageRegion(pDoc->m_Primary3DImage.GetPointer()->GetBufferedRegion());

 

             itk::Point<double,3> initialCenter = pDoc->m_transformMomentCenter->GetCenter();    

             itk::Vector<double,3> initialTranslation = pDoc->m_3DTransformManualMode->GetOffset();

             transform->SetCenter(initialCenter);

             transform->SetTranslation(initialTranslation);

 

             typedef TransformType::VersorType  VersorType;

             typedef VersorType::VectorType     VectorType;

             VersorType     rotation;

             VectorType     axis;

 

             axis[0] = 0.0;

             axis[1] = 0.0;

             axis[2] = 1.0;

 

             const double angle = 0;

             rotation.Set(axis,angle);

             transform->SetRotation(rotation);

 

             registration->SetInitialTransformParameters(transform->GetParameters());

 

             typedef OptimizerType::ScalesType                        OptimizerScalesType;

             OptimizerScalesType optimizerScales(transform->GetNumberOfParameters());

             

             const double translationScale = 

                           1.0 / (10.0 * pDoc->m_vSpacingPrimary3DImage[0]*pDoc->m_sizePrimary3DImage[0]);

             optimizerScales[0] = 1.0;

             optimizerScales[1] = 1.0;

             optimizerScales[2] = 1.0;

             optimizerScales[3] = translationScale;

             optimizerScales[4] = translationScale;

             optimizerScales[5] = translationScale;

 

             optimizer->SetScales(optimizerScales);

 

             optimizer->SetMaximumStepLength(1.0); 

             optimizer->SetMinimumStepLength(0.005);

 

             optimizer->SetNumberOfIterations(50);

 

             CCommandIterationUpdate::Pointer observer = CCommandIterationUpdate::New();

             observer->SetDocument(pDoc);

             optimizer->AddObserver( itk::IterationEvent(), observer );

 

             try

             {

                           registration->StartRegistration(); 

             }

             catch( itk::ExceptionObject & err ) 

             { 

                           TRACE("ExceptionObject caught !\n");

                           return 0;

             }     

             return 0;

}

=========== source end ===================

 

I suspect pixel spacing of series. A case of success series is both have same pixel spacing, but other is different. What do you think about it?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20040603/80a88bfe/attachment-0001.html


More information about the Insight-users mailing list