Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkImageRegistrationMethod.h"
00019
00020 #include "mitkITKImageImport.h"
00021 #include "mitkRigidRegistrationObserver.h"
00022
00023 #include <itkResampleImageFilter.h>
00024 #include <itkImageRegistrationMethod.h>
00025 #include <itkLinearInterpolateImageFunction.h>
00026 #include <itkNearestNeighborInterpolateImageFunction.h>
00027 #include <itkImage.h>
00028
00029 #include <itkImageToImageMetric.h>
00030 #include <itkSingleValuedNonLinearOptimizer.h>
00031
00032 #include <itkNormalizeImageFilter.h>
00033 #include <itkDiscreteGaussianImageFilter.h>
00034 #include <itkObject.h>
00035
00036 namespace mitk {
00037
00038 template<typename TPixel, unsigned int VImageDimension>
00039 void ImageRegistrationMethod::GenerateData2(itk::Image<TPixel, VImageDimension>* itkImage1)
00040 {
00041
00042 typedef typename itk::Image<TPixel, VImageDimension> FixedImageType;
00043 typedef typename itk::Image<TPixel, VImageDimension> MovingImageType;
00044 typedef typename itk::Image< unsigned char, VImageDimension > MaskImageType;
00045 typedef typename itk::ImageMaskSpatialObject< VImageDimension > ImageMaskType;
00046 typename ImageMaskType::Pointer movingImageMask;
00047 if(m_MovingMask.IsNotNull())
00048 {
00049 typename MovingImageType::Pointer movingMask = MovingImageType::New();
00050 mitk::CastToItkImage(m_MovingMask, movingMask);
00051 typename itk::CastImageFilter<MovingImageType, MaskImageType>::Pointer maskImageCaster = itk::CastImageFilter<MovingImageType, MaskImageType>::New();
00052 maskImageCaster->SetInput(movingMask);
00053 maskImageCaster->UpdateLargestPossibleRegion();
00054 movingImageMask = ImageMaskType::New();
00055 movingImageMask->SetImage(maskImageCaster->GetOutput());
00056 }
00057 typename ImageMaskType::Pointer fixedImageMask;
00058 if(m_FixedMask.IsNotNull())
00059 {
00060 typename FixedImageType::Pointer fixedMask = FixedImageType::New();
00061 mitk::CastToItkImage(m_FixedMask, fixedMask);
00062 typename itk::CastImageFilter<FixedImageType, MaskImageType>::Pointer maskImageCaster = itk::CastImageFilter<FixedImageType, MaskImageType>::New();
00063 maskImageCaster->SetInput(fixedMask);
00064 maskImageCaster->UpdateLargestPossibleRegion();
00065 fixedImageMask = ImageMaskType::New();
00066 fixedImageMask->SetImage(maskImageCaster->GetOutput());
00067 }
00068
00069 typedef typename itk::Image<TPixel, VImageDimension> FixedImageType;
00070 typedef typename itk::Image<TPixel, VImageDimension> MovingImageType;
00071 typedef typename itk::LinearInterpolateImageFunction<MovingImageType, double> InterpolatorType;
00072 typedef itk::NearestNeighborInterpolateImageFunction<MovingImageType, double> InterpolatorType2;
00073 typedef typename itk::ImageRegistrationMethod<FixedImageType, MovingImageType> RegistrationType;
00074 typedef typename itk::Transform< double, VImageDimension, VImageDimension > TransformType;
00075 typedef typename TransformType::Pointer TransformPointer;
00076 typedef typename itk::ImageToImageMetric<FixedImageType, MovingImageType> MetricType;
00077 typedef typename MetricType::Pointer MetricPointer;
00078 typedef typename itk::SingleValuedNonLinearOptimizer OptimizerType;
00079
00080 typename FixedImageType::Pointer fixedImage = FixedImageType::New();
00081 typename MovingImageType::Pointer movingImage = itkImage1;
00082 mitk::CastToItkImage(m_ReferenceImage, fixedImage);
00083
00084 MetricPointer metric = dynamic_cast<MetricType*>(m_Metric.GetPointer());
00085 if(movingImageMask.IsNotNull())
00086 metric->SetMovingImageMask(movingImageMask);
00087 if(fixedImageMask.IsNotNull())
00088 metric->SetFixedImageMask(fixedImageMask);
00089
00090 TransformPointer transform = dynamic_cast<TransformType*>(m_Transform.GetPointer());
00091
00092 typename OptimizerType::Pointer optimizer = dynamic_cast<OptimizerType*>(m_Optimizer.GetPointer());
00093
00094 if (m_OptimizerScales.Size() != 0)
00095 {
00096 typename OptimizerType::ScalesType scales( transform->GetNumberOfParameters() );
00097 for (unsigned int i = 0; i < scales.Size(); i++)
00098 {
00099 scales[i] = m_OptimizerScales[i];
00100 }
00101 optimizer->SetScales( scales );
00102 }
00103
00104 typename RegistrationType::Pointer registration = RegistrationType::New();
00105 registration->SetMetric(metric);
00106 registration->SetOptimizer(optimizer);
00107 registration->SetTransform(transform);
00108 registration->SetFixedImage(fixedImage);
00109 registration->SetMovingImage(movingImage);
00110 registration->SetFixedImageRegion(fixedImage->GetBufferedRegion());
00111
00112
00113
00114
00115
00116
00117 itk::Array<double> zeroInitial;
00118 zeroInitial.set_size(transform->GetNumberOfParameters());
00119 zeroInitial.fill(0.0);
00120 if (zeroInitial.size() >= 1)
00121 {
00122 zeroInitial[0] = 1.0;
00123 }
00124 if (zeroInitial.size() >= 5)
00125 {
00126 zeroInitial[4] = 1.0;
00127 }
00128 if (zeroInitial.size() >= 9)
00129 {
00130 zeroInitial[8] = 1.0;
00131 }
00132 registration->SetInitialTransformParameters( zeroInitial );
00133 optimizer->SetInitialPosition( zeroInitial );
00134
00135 if (m_Interpolator == LINEARINTERPOLATOR)
00136 {
00137 typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
00138 registration->SetInterpolator(interpolator);
00139 }
00140 else if (m_Interpolator == NEARESTNEIGHBORINTERPOLATOR)
00141 {
00142 typename InterpolatorType2::Pointer interpolator = InterpolatorType2::New();
00143 registration->SetInterpolator(interpolator);
00144 }
00145
00146 if (m_Observer.IsNotNull())
00147 {
00148 m_Observer->AddStepsToDo(20);
00149 optimizer->AddObserver(itk::AnyEvent(), m_Observer);
00150 registration->AddObserver(itk::AnyEvent(), m_Observer);
00151 transform->AddObserver(itk::AnyEvent(), m_Observer);
00152 }
00153 registration->Update();
00154 if (m_Observer.IsNotNull())
00155 {
00156 optimizer->RemoveAllObservers();
00157 registration->RemoveAllObservers();
00158 transform->RemoveAllObservers();
00159 m_Observer->SetRemainingProgress(15);
00160 }
00161 if (m_Observer.IsNotNull())
00162 {
00163 m_Observer->SetRemainingProgress(5);
00164 }
00165 }
00166 }