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 "itkImageFileWriter.h"
00019 #include "itkWarpImageFilter.h"
00020 #include "itkInverseDeformationFieldImageFilter.h"
00021
00022 #include "mitkSymmetricForcesDemonsRegistration.h"
00023
00024 namespace mitk {
00025
00026 SymmetricForcesDemonsRegistration::SymmetricForcesDemonsRegistration():
00027 m_Iterations(50),
00028 m_StandardDeviation(1.0),
00029 m_FieldName("newField.mhd"),
00030 m_ResultName("deformedImage.mhd"),
00031 m_SaveField(true),
00032 m_SaveResult(true),
00033 m_DeformationField(NULL)
00034 {
00035
00036 }
00037
00038 SymmetricForcesDemonsRegistration::~SymmetricForcesDemonsRegistration()
00039 {
00040 }
00041
00042 void SymmetricForcesDemonsRegistration::SetNumberOfIterations(int iterations)
00043 {
00044 m_Iterations = iterations;
00045 }
00046
00047 void SymmetricForcesDemonsRegistration::SetStandardDeviation(float deviation)
00048 {
00049 m_StandardDeviation = deviation;
00050 }
00051
00052 void SymmetricForcesDemonsRegistration::SetSaveDeformationField(bool saveField)
00053 {
00054 m_SaveField = saveField;
00055 }
00056
00057 void SymmetricForcesDemonsRegistration::SetDeformationFieldFileName(const char* fieldName)
00058 {
00059 m_FieldName = fieldName;
00060 }
00061
00062 void SymmetricForcesDemonsRegistration::SetSaveResult(bool saveResult)
00063 {
00064 m_SaveResult = saveResult;
00065 }
00066
00067 void SymmetricForcesDemonsRegistration::SetResultFileName(const char* resultName)
00068 {
00069 m_ResultName = resultName;
00070 }
00071
00072 itk::Image<class itk::Vector<float, 3>,3>::Pointer SymmetricForcesDemonsRegistration::GetDeformationField()
00073 {
00074 return m_DeformationField;
00075 }
00076
00077 template < typename TPixel, unsigned int VImageDimension >
00078 void SymmetricForcesDemonsRegistration::GenerateData2( itk::Image<TPixel, VImageDimension>* itkImage1)
00079 {
00080 typedef typename itk::Image< TPixel, VImageDimension > FixedImageType;
00081 typedef typename itk::Image< TPixel, VImageDimension > MovingImageType;
00082
00083 typedef float InternalPixelType;
00084 typedef typename itk::Image< InternalPixelType, VImageDimension > InternalImageType;
00085 typedef typename itk::CastImageFilter< FixedImageType,
00086 InternalImageType > FixedImageCasterType;
00087 typedef typename itk::CastImageFilter< MovingImageType,
00088 InternalImageType > MovingImageCasterType;
00089 typedef typename itk::Vector< float, VImageDimension > VectorPixelType;
00090 typedef typename itk::Image< VectorPixelType, VImageDimension > DeformationFieldType;
00091 typedef typename itk::SymmetricForcesDemonsRegistrationFilter<
00092 InternalImageType,
00093 InternalImageType,
00094 DeformationFieldType> RegistrationFilterType;
00095 typedef typename itk::WarpImageFilter<
00096 MovingImageType,
00097 MovingImageType,
00098 DeformationFieldType > WarperType;
00099 typedef typename itk::LinearInterpolateImageFunction<
00100 MovingImageType,
00101 double > InterpolatorType;
00102
00103 typedef TPixel OutputPixelType;
00104 typedef typename itk::Image< OutputPixelType, VImageDimension > OutputImageType;
00105 typedef typename itk::CastImageFilter<
00106 MovingImageType,
00107 OutputImageType > CastFilterType;
00108 typedef typename itk::ImageFileWriter< OutputImageType > WriterType;
00109 typedef typename itk::ImageFileWriter< DeformationFieldType > FieldWriterType;
00110 typedef typename itk::InverseDeformationFieldImageFilter<DeformationFieldType, DeformationFieldType> InverseFilterType;
00111
00112
00113 typename FixedImageType::Pointer fixedImage = FixedImageType::New();
00114 mitk::CastToItkImage(m_ReferenceImage, fixedImage);
00115 typename MovingImageType::Pointer movingImage = itkImage1;
00116
00117 if (fixedImage.IsNotNull() && movingImage.IsNotNull())
00118 {
00119 typename RegistrationFilterType::Pointer filter = RegistrationFilterType::New();
00120
00121 this->AddStepsToDo(4);
00122 itk::ReceptorMemberCommand<SymmetricForcesDemonsRegistration>::Pointer command = itk::ReceptorMemberCommand<SymmetricForcesDemonsRegistration>::New();
00123 command->SetCallbackFunction(this, &SymmetricForcesDemonsRegistration::SetProgress);
00124 filter->AddObserver( itk::IterationEvent(), command );
00125
00126 typename FixedImageCasterType::Pointer fixedImageCaster = FixedImageCasterType::New();
00127 fixedImageCaster->SetInput(fixedImage);
00128 filter->SetFixedImage( fixedImageCaster->GetOutput() );
00129 typename MovingImageCasterType::Pointer movingImageCaster = MovingImageCasterType::New();
00130 movingImageCaster->SetInput(movingImage);
00131 filter->SetMovingImage(movingImageCaster->GetOutput());
00132 filter->SetNumberOfIterations( m_Iterations );
00133 filter->SetStandardDeviations( m_StandardDeviation );
00134 filter->Update();
00135
00136 typename WarperType::Pointer warper = WarperType::New();
00137 typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
00138
00139 warper->SetInput( movingImage );
00140 warper->SetInterpolator( interpolator );
00141 warper->SetOutputSpacing( fixedImage->GetSpacing() );
00142 warper->SetOutputOrigin( fixedImage->GetOrigin() );
00143 warper->SetDeformationField( filter->GetOutput() );
00144 warper->Update();
00145 typename WriterType::Pointer writer = WriterType::New();
00146 typename CastFilterType::Pointer caster = CastFilterType::New();
00147
00148 writer->SetFileName( m_ResultName );
00149
00150 caster->SetInput( warper->GetOutput() );
00151 writer->SetInput( caster->GetOutput() );
00152 if(m_SaveResult)
00153 {
00154 writer->Update();
00155 }
00156 Image::Pointer outputImage = this->GetOutput();
00157 mitk::CastToMitkImage( warper->GetOutput(), outputImage );
00158
00159 if (VImageDimension == 2)
00160 {
00161 typedef DeformationFieldType VectorImage2DType;
00162 typedef typename DeformationFieldType::PixelType Vector2DType;
00163
00164 typename VectorImage2DType::ConstPointer vectorImage2D = filter->GetOutput();
00165
00166 typename VectorImage2DType::RegionType region2D = vectorImage2D->GetBufferedRegion();
00167 typename VectorImage2DType::IndexType index2D = region2D.GetIndex();
00168 typename VectorImage2DType::SizeType size2D = region2D.GetSize();
00169
00170
00171 typedef typename itk::Vector< float, 3 > Vector3DType;
00172 typedef typename itk::Image< Vector3DType, 3 > VectorImage3DType;
00173
00174 typedef typename itk::ImageFileWriter< VectorImage3DType > WriterType;
00175
00176 WriterType::Pointer writer3D = WriterType::New();
00177
00178 VectorImage3DType::Pointer vectorImage3D = VectorImage3DType::New();
00179
00180 VectorImage3DType::RegionType region3D;
00181 VectorImage3DType::IndexType index3D;
00182 VectorImage3DType::SizeType size3D;
00183
00184 index3D[0] = index2D[0];
00185 index3D[1] = index2D[1];
00186 index3D[2] = 0;
00187
00188 size3D[0] = size2D[0];
00189 size3D[1] = size2D[1];
00190 size3D[2] = 1;
00191
00192 region3D.SetSize( size3D );
00193 region3D.SetIndex( index3D );
00194
00195 typename VectorImage2DType::SpacingType spacing2D = vectorImage2D->GetSpacing();
00196 VectorImage3DType::SpacingType spacing3D;
00197
00198 spacing3D[0] = spacing2D[0];
00199 spacing3D[1] = spacing2D[1];
00200 spacing3D[2] = 1.0;
00201
00202 vectorImage3D->SetSpacing( spacing3D );
00203
00204 vectorImage3D->SetRegions( region3D );
00205 vectorImage3D->Allocate();
00206
00207 typedef typename itk::ImageRegionConstIterator< VectorImage2DType > Iterator2DType;
00208
00209 typedef typename itk::ImageRegionIterator< VectorImage3DType > Iterator3DType;
00210
00211 Iterator2DType it2( vectorImage2D, region2D );
00212 Iterator3DType it3( vectorImage3D, region3D );
00213
00214 it2.GoToBegin();
00215 it3.GoToBegin();
00216
00217 Vector2DType vector2D;
00218 Vector3DType vector3D;
00219
00220 vector3D[2] = 0;
00221
00222 while( !it2.IsAtEnd() )
00223 {
00224 vector2D = it2.Get();
00225 vector3D[0] = vector2D[0];
00226 vector3D[1] = vector2D[1];
00227 it3.Set( vector3D );
00228 ++it2;
00229 ++it3;
00230 }
00231
00232 writer3D->SetInput( vectorImage3D );
00233 m_DeformationField = vectorImage3D;
00234
00235 writer3D->SetFileName( m_FieldName );
00236
00237 try
00238 {
00239 if(m_SaveField)
00240 {
00241 writer3D->Update();
00242 }
00243 }
00244 catch( itk::ExceptionObject & excp )
00245 {
00246 MITK_ERROR << excp << std::endl;
00247 }
00248 }
00249 else
00250 {
00251 typename FieldWriterType::Pointer fieldwriter = FieldWriterType::New();
00252 fieldwriter->SetFileName( m_FieldName );
00253 fieldwriter->SetInput( filter->GetOutput() );
00254
00255 m_DeformationField = (itk::Image<itk::Vector<float, 3>,3> *)(filter->GetOutput());
00256 if(m_SaveField)
00257 {
00258 fieldwriter->Update();
00259 }
00260
00261 }
00262 this->SetRemainingProgress(4);
00263 }
00264 }
00265 }