go home Home | Main Page | Topics | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals | Related Pages
Loading...
Searching...
No Matches
elxElastixBase.h
Go to the documentation of this file.
1/*=========================================================================
2 *
3 * Copyright UMC Utrecht and contributors
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18
27
28#ifndef elxElastixBase_h
29#define elxElastixBase_h
30
31#include "elxBaseComponent.h"
33#include "elxConfiguration.h"
34#include "elxDefaultConstruct.h"
35#include "elxIterationInfo.h"
36#include "elxMacro.h"
37#include "elxlog.h"
38
39// ITK header files:
40#include <itkChangeInformationImageFilter.h>
41#include <itkDataObject.h>
42#include <itkImageFileReader.h>
43#include <itkMersenneTwisterRandomVariateGenerator.h>
44#include <itkObject.h>
45#include <itkTimeProbe.h>
46#include <itkVectorContainer.h>
47
48#include <fstream>
49#include <iomanip>
50
57#define elxGetObjectMacro(_name, _type) \
58 _type * Get##_name() const { return m_##_name.GetPointer(); }
59// end elxGetObjectMacro
60
61#define elxSetObjectMacro(_name, _type) \
62 void Set##_name(_type * _arg) \
63 { \
64 if (m_##_name != _arg) \
65 { \
66 m_##_name = _arg; \
67 this->itk::Object::Modified(); \
68 } \
69 }
70// end elxSetObjectMacro
71
73#define elxGetNumberOfMacro(_name) \
74 unsigned int GetNumberOf##_name##s() const \
75 { \
76 if (m_##_name##Container != nullptr) \
77 { \
78 return m_##_name##Container->Size(); \
79 } \
80 return 0; \
81 }
82// end elxGetNumberOfMacro
83
84namespace elastix
85{
141
143 : public itk::Object
144 , public BaseComponent
145{
146public:
148
152
154 using ObjectPointer = itk::Object::Pointer;
155 using DataObjectPointer = itk::DataObject::Pointer; // for the images
156 using ObjectContainerType = itk::VectorContainer<unsigned int, ObjectPointer>;
157 using ObjectContainerPointer = ObjectContainerType::Pointer;
158 using DataObjectContainerType = itk::VectorContainer<unsigned int, DataObjectPointer>;
159 using DataObjectContainerPointer = DataObjectContainerType::Pointer;
160 using FileNameContainerType = itk::VectorContainer<unsigned int, std::string>;
161 using FileNameContainerPointer = FileNameContainerType::Pointer;
162
164 using ResultImageType = itk::DataObject;
165
167 using ResultDeformationFieldType = itk::DataObject;
168
172 using FlatDirectionCosinesType = std::vector<double>;
173
175 using CoordinateType = double; // itk::CostFunction::ParametersValueType
176
179
183
185 void
187
190 {
191 return m_DBIndex;
192 }
193
198 elxGetObjectMacro(RegistrationContainer, ObjectContainerType);
199 elxGetObjectMacro(FixedImagePyramidContainer, ObjectContainerType);
200 elxGetObjectMacro(MovingImagePyramidContainer, ObjectContainerType);
201 elxGetObjectMacro(InterpolatorContainer, ObjectContainerType);
202 elxGetObjectMacro(ImageSamplerContainer, ObjectContainerType);
206 elxGetObjectMacro(ResampleInterpolatorContainer, ObjectContainerType);
208
213 elxSetObjectMacro(RegistrationContainer, ObjectContainerType);
214 elxSetObjectMacro(FixedImagePyramidContainer, ObjectContainerType);
215 elxSetObjectMacro(MovingImagePyramidContainer, ObjectContainerType);
216 elxSetObjectMacro(InterpolatorContainer, ObjectContainerType);
217 elxSetObjectMacro(ImageSamplerContainer, ObjectContainerType);
221 elxSetObjectMacro(ResampleInterpolatorContainer, ObjectContainerType);
223
229
235
237 elxGetObjectMacro(FixedPoints, const itk::Object);
238 elxGetObjectMacro(MovingPoints, const itk::Object);
239 elxSetObjectMacro(FixedPoints, const itk::Object);
240 elxSetObjectMacro(MovingPoints, const itk::Object);
241
245
247 elxGetObjectMacro(ResultDeformationFieldContainer, DataObjectContainerType);
248 elxSetObjectMacro(ResultDeformationFieldContainer, DataObjectContainerType);
249
253 elxGetObjectMacro(FixedImageFileNameContainer, FileNameContainerType);
254 elxGetObjectMacro(MovingImageFileNameContainer, FileNameContainerType);
255 elxSetObjectMacro(FixedImageFileNameContainer, FileNameContainerType);
256 elxSetObjectMacro(MovingImageFileNameContainer, FileNameContainerType);
257
261 elxGetObjectMacro(FixedMaskFileNameContainer, FileNameContainerType);
262 elxGetObjectMacro(MovingMaskFileNameContainer, FileNameContainerType);
263 elxSetObjectMacro(FixedMaskFileNameContainer, FileNameContainerType);
264 elxSetObjectMacro(MovingMaskFileNameContainer, FileNameContainerType);
265
267 elxGetNumberOfMacro(Registration);
268 elxGetNumberOfMacro(FixedImagePyramid);
269 elxGetNumberOfMacro(MovingImagePyramid);
270 elxGetNumberOfMacro(Interpolator);
271 elxGetNumberOfMacro(ImageSampler);
275 elxGetNumberOfMacro(ResampleInterpolator);
279 elxGetNumberOfMacro(FixedImageFileName);
280 elxGetNumberOfMacro(MovingImageFileName);
283 elxGetNumberOfMacro(FixedMaskFileName);
284 elxGetNumberOfMacro(MovingMaskFileName);
286 elxGetNumberOfMacro(ResultDeformationField);
287
292 elxSetObjectMacro(InitialTransform, itk::Object);
293 elxGetObjectMacro(InitialTransform, itk::Object);
294
301 elxSetObjectMacro(FinalTransform, itk::Object);
302 elxGetObjectMacro(FinalTransform, itk::Object);
303
305 virtual int
306 Run() = 0;
307
309 virtual int
310 ApplyTransform(bool doReadTransform) = 0;
311
315 int
316 BeforeAllBase() override;
317
321 int
323
324 itk::Statistics::MersenneTwisterRandomVariateGenerator &
330 GetResultImage(const unsigned int idx = 0) const;
331
332 void
334
336 GetResultDeformationField(unsigned int idx = 0) const;
337
338 void
340
341
345 bool
347
350 void
352
355
357 virtual void
359
363
365 void
366 SetTransformConfigurations(const std::vector<Configuration::ConstPointer> & configurations);
367
370 GetTransformConfiguration(const size_t index) const;
371
376
378 size_t
380
383 {
384 return m_IterationInfo;
385 }
386
387 std::ostream &
388 GetIterationInfoAt(const char * const name)
389 {
390 return m_IterationInfo[name];
391 }
392
393 void
394 AddTargetCellToIterationInfo(const char * const name)
395 {
396 m_IterationInfo.AddNewTargetCell(name);
397 }
398
399protected:
401 ~ElastixBase() override = default;
402
404
406
408 itk::TimeProbe m_Timer0{};
409 itk::TimeProbe m_IterationTimer{};
410 itk::TimeProbe m_ResolutionTimer{};
411
414
416 unsigned int m_IterationCounter{};
417
420
421 std::ofstream m_IterationInfoFile;
422
435 template <typename TImage>
436 class ITK_TEMPLATE_EXPORT MultipleImageLoader
437 {
438 public:
439 using DirectionType = typename TImage::DirectionType;
440
442 GenerateImageContainer(const FileNameContainerType * const fileNameContainer,
443 const std::string & imageDescription,
444 bool useDirectionCosines,
445 DirectionType * originalDirectionCosines = nullptr)
446 {
447 const auto imageContainer = DataObjectContainerType::New();
448
450 for (const auto & fileName : *fileNameContainer)
451 {
452 const auto infoChanger = itk::ChangeInformationImageFilter<TImage>::New();
453 infoChanger->SetChangeDirection(!useDirectionCosines);
454
456 try
457 {
458 const auto image = itk::ReadImage<TImage>(fileName);
459 infoChanger->SetInput(image);
460 infoChanger->Update();
461
463 if (originalDirectionCosines != nullptr)
464 {
465 *originalDirectionCosines = image->GetDirection();
466 }
467 }
468 catch (itk::ExceptionObject & excp)
469 {
471 std::string err_str = excp.GetDescription();
472 err_str += "\nError occurred while reading the image described as " + imageDescription + ", with file name " +
473 fileName + "\n";
474 excp.SetDescription(err_str);
476 throw;
477 }
478
480 imageContainer->push_back(infoChanger->GetOutput());
481
482
483 } // end for
484
485 return imageContainer;
486
487 } // end static method GenerateImageContainer
488
489
492 };
493
497
498private:
500
502 std::vector<Configuration::ConstPointer> m_TransformConfigurations;
503
505
511 ObjectContainerPointer m_InterpolatorContainer{ ObjectContainerType::New() };
512 ObjectContainerPointer m_ImageSamplerContainer{ ObjectContainerType::New() };
513 ObjectContainerPointer m_MetricContainer{ ObjectContainerType::New() };
514 ObjectContainerPointer m_OptimizerContainer{ ObjectContainerType::New() };
515 ObjectContainerPointer m_RegistrationContainer{ ObjectContainerType::New() };
516 ObjectContainerPointer m_ResamplerContainer{ ObjectContainerType::New() };
518 ObjectContainerPointer m_TransformContainer{ ObjectContainerType::New() };
519
521 DataObjectContainerPointer m_FixedImageContainer{ DataObjectContainerType::New() };
522 DataObjectContainerPointer m_MovingImageContainer{ DataObjectContainerType::New() };
523 DataObjectContainerPointer m_FixedMaskContainer{ DataObjectContainerType::New() };
524 DataObjectContainerPointer m_MovingMaskContainer{ DataObjectContainerType::New() };
525
527 itk::SmartPointer<const itk::Object> m_FixedPoints{ nullptr };
528 itk::SmartPointer<const itk::Object> m_MovingPoints{ nullptr };
529
531 DataObjectContainerPointer m_ResultImageContainer{ DataObjectContainerType::New() };
532
535
541
545
550
552};
553
554} // end namespace elastix
555
556#undef elxGetObjectMacro
557#undef elxSetObjectMacro
558#undef elxGetNumberOfMacro
559
560#endif // end #ifndef elxElastixBase_h
itk::SmartPointer< Self > Pointer
A class that deals with user given parameters and command line arguments.
itk::SmartPointer< Self > Pointer
itk::SmartPointer< const Self > ConstPointer
typename TImage::DirectionType DirectionType
static DataObjectContainerPointer GenerateImageContainer(const FileNameContainerType *const fileNameContainer, const std::string &imageDescription, bool useDirectionCosines, DirectionType *originalDirectionCosines=nullptr)
elxSetObjectMacro(FixedImageContainer, DataObjectContainerType)
itk::Statistics::MersenneTwisterRandomVariateGenerator & GetRandomVariateGenerator()
itk::TimeProbe m_ResolutionTimer
itk::TimeProbe m_IterationTimer
elxSetObjectMacro(MetricContainer, ObjectContainerType)
itk::VectorContainer< unsigned int, DataObjectPointer > DataObjectContainerType
FlatDirectionCosinesType m_OriginalFixedImageDirectionFlat
ITK_DISALLOW_COPY_AND_MOVE(ElastixBase)
DBIndexType GetDBIndex()
DataObjectContainerPointer m_FixedImageContainer
void AddTargetCellToIterationInfo(const char *const name)
elxGetObjectMacro(MovingImageFileNameContainer, FileNameContainerType)
elxGetObjectMacro(InitialTransform, itk::Object)
DataObjectContainerPointer m_MovingImageContainer
elxGetObjectMacro(FinalTransform, itk::Object)
ObjectContainerPointer m_RegistrationContainer
elxGetNumberOfMacro(MovingMaskFileName)
itk::SmartPointer< const itk::Object > m_FixedPoints
FileNameContainerPointer m_MovingMaskFileNameContainer
itk::DataObject::Pointer DataObjectPointer
static DataObjectContainerPointer GenerateDataObjectContainer(DataObjectPointer dataObject)
elxGetObjectMacro(FixedPoints, const itk::Object)
Configuration::Pointer m_Configuration
elxSetObjectMacro(ResultImageContainer, DataObjectContainerType)
elxSetObjectMacro(OptimizerContainer, ObjectContainerType)
elxSetObjectMacro(RegistrationContainer, ObjectContainerType)
itk::VectorContainer< unsigned int, std::string > FileNameContainerType
elxGetObjectMacro(FixedImagePyramidContainer, ObjectContainerType)
elxGetObjectMacro(FixedMaskFileNameContainer, FileNameContainerType)
itk::DataObject ResultImageType
ObjectContainerPointer m_OptimizerContainer
ObjectContainerPointer m_ResampleInterpolatorContainer
elxGetNumberOfMacro(Transform)
FileNameContainerPointer m_FixedImageFileNameContainer
elxGetNumberOfMacro(FixedImage)
elxSetObjectMacro(ResamplerContainer, ObjectContainerType)
std::vector< double > FlatDirectionCosinesType
elxGetObjectMacro(MovingImageContainer, DataObjectContainerType)
elxGetObjectMacro(TransformContainer, ObjectContainerType)
unsigned int m_IterationCounter
vcl_size_t GetNumberOfTransformConfigurations() const
elxGetNumberOfMacro(MovingMask)
itk::VectorContainer< unsigned int, ObjectPointer > ObjectContainerType
elxGetNumberOfMacro(MovingImage)
DataObjectContainerPointer m_FixedMaskContainer
elxSetObjectMacro(MovingImageContainer, DataObjectContainerType)
elxSetObjectMacro(Configuration, Configuration)
elxGetNumberOfMacro(FixedImagePyramid)
Configuration::ConstPointer GetTransformConfiguration(const vcl_size_t index) const
virtual int Run()=0
elxSetObjectMacro(MovingImagePyramidContainer, ObjectContainerType)
elxGetNumberOfMacro(FixedMaskFileName)
elxGetObjectMacro(OptimizerContainer, ObjectContainerType)
elxGetNumberOfMacro(FixedMask)
itk::Object::Pointer ObjectPointer
DataObjectContainerType::Pointer DataObjectContainerPointer
elxGetObjectMacro(ImageSamplerContainer, ObjectContainerType)
void SetOriginalFixedImageDirectionFlat(const FlatDirectionCosinesType &arg)
ObjectContainerPointer m_ResamplerContainer
void SetResultDeformationField(DataObjectPointer result_deformationfield)
elxGetObjectMacro(MovingMaskContainer, DataObjectContainerType)
elxGetObjectMacro(FixedImageContainer, DataObjectContainerType)
ObjectContainerPointer m_InterpolatorContainer
bool GetUseDirectionCosines() const
elxGetObjectMacro(ResampleInterpolatorContainer, ObjectContainerType)
elxSetObjectMacro(InitialTransform, itk::Object)
elxGetObjectMacro(FixedImageFileNameContainer, FileNameContainerType)
elxSetObjectMacro(FixedImagePyramidContainer, ObjectContainerType)
DataObjectContainerPointer m_ResultImageContainer
elxSetObjectMacro(FixedPoints, const itk::Object)
elxSetObjectMacro(MovingMaskContainer, DataObjectContainerType)
elxGetNumberOfMacro(ResultImage)
ComponentDatabase::IndexType DBIndexType
elxGetNumberOfMacro(ResultDeformationField)
DataObjectContainerPointer m_MovingMaskContainer
elxGetNumberOfMacro(ResampleInterpolator)
elxGetObjectMacro(RegistrationContainer, ObjectContainerType)
elxSetObjectMacro(ResampleInterpolatorContainer, ObjectContainerType)
elxGetNumberOfMacro(Interpolator)
elxSetObjectMacro(FinalTransform, itk::Object)
const FlatDirectionCosinesType & GetOriginalFixedImageDirectionFlat() const
elxGetNumberOfMacro(MovingImageFileName)
elxSetObjectMacro(ImageSamplerContainer, ObjectContainerType)
void SetDBIndex(DBIndexType _arg)
std::string m_CurrentTransformParameterFileName
ResultDeformationFieldType * GetResultDeformationField(unsigned int idx=0) const
elxSetObjectMacro(MovingMaskFileNameContainer, FileNameContainerType)
ResultImageType * GetResultImage(const unsigned int idx=0) const
elxSetObjectMacro(MovingImageFileNameContainer, FileNameContainerType)
elxGetObjectMacro(InterpolatorContainer, ObjectContainerType)
ObjectContainerPointer m_FixedImagePyramidContainer
elxGetObjectMacro(MetricContainer, ObjectContainerType)
elxGetObjectMacro(Configuration, Configuration)
int BeforeAllBase() override
virtual int ApplyTransform(bool doReadTransform)=0
elxGetNumberOfMacro(Resampler)
elxSetObjectMacro(InterpolatorContainer, ObjectContainerType)
ObjectPointer m_InitialTransform
std::vector< Configuration::ConstPointer > m_TransformConfigurations
Configuration::ConstPointer GetPreviousTransformConfiguration(const Configuration &configuration) const
BaseComponent Superclass
ObjectContainerPointer m_MovingImagePyramidContainer
elxGetObjectMacro(ResamplerContainer, ObjectContainerType)
elxSetObjectMacro(ResultDeformationFieldContainer, DataObjectContainerType)
elxSetObjectMacro(FixedMaskFileNameContainer, FileNameContainerType)
elx::DefaultConstruct< itk::Statistics::MersenneTwisterRandomVariateGenerator > m_RandomVariateGenerator
elxSetObjectMacro(FixedMaskContainer, DataObjectContainerType)
std::ofstream m_IterationInfoFile
elxGetNumberOfMacro(Optimizer)
itk::DataObject ResultDeformationFieldType
virtual void CreateTransformParameterMap()=0
ObjectContainerPointer m_TransformContainer
ObjectContainerPointer m_MetricContainer
IterationInfo m_IterationInfo
ObjectContainerPointer m_ImageSamplerContainer
ParameterMapType GetTransformParameterMap() const
elxGetNumberOfMacro(Registration)
elxSetObjectMacro(TransformContainer, ObjectContainerType)
elxGetObjectMacro(MovingPoints, const itk::Object)
elxSetObjectMacro(FixedImageFileNameContainer, FileNameContainerType)
elxGetNumberOfMacro(MovingImagePyramid)
itk::ParameterMapInterface::ParameterMapType ParameterMapType
elxGetNumberOfMacro(ImageSampler)
elxSetObjectMacro(MovingPoints, const itk::Object)
void SetResultImage(DataObjectPointer result_image)
elxGetObjectMacro(ResultImageContainer, DataObjectContainerType)
elxGetObjectMacro(ResultDeformationFieldContainer, DataObjectContainerType)
~ElastixBase() override=default
elxGetObjectMacro(MovingMaskFileNameContainer, FileNameContainerType)
ObjectPointer m_FinalTransform
itk::SmartPointer< const itk::Object > m_MovingPoints
elxGetObjectMacro(MovingImagePyramidContainer, ObjectContainerType)
elxGetNumberOfMacro(FixedImageFileName)
FileNameContainerType::Pointer FileNameContainerPointer
void SetTransformConfigurations(const std::vector< Configuration::ConstPointer > &configurations)
ObjectContainerType::Pointer ObjectContainerPointer
elxGetObjectMacro(FixedMaskContainer, DataObjectContainerType)
FileNameContainerPointer m_FixedMaskFileNameContainer
itk::TimeProbe m_Timer0
ParameterMapType m_TransformParameterMap
FileNameContainerPointer m_MovingImageFileNameContainer
std::ostream & GetIterationInfoAt(const char *const name)
IterationInfo & GetIterationInfo()
DataObjectContainerPointer m_ResultDeformationFieldContainer
ComponentDatabase::Pointer ComponentDatabasePointer
ParameterFileParser::ParameterMapType ParameterMapType


Generated on 1774142652 for elastix by doxygen 1.15.0 elastix logo