#ifndef ITKREG23_H #define ITKREG23_h #include "itkCommand.h" #include "itkExhaustiveOptimizer.h" #include "itkMutualInformationTwoImageToOneImageMetric.h" #include "itkNormalizedCorrelationTwoImageToOneImageMetric.h" #include "itkPowellOptimizer.h" #include "itkTwoProjectionImageRegistrationMethod.h" #include "itkAmoebaOptimizer.h" #include "itkCommand.h" #include "itkObject.h" #include "itkObjectFactory.h" #include "itkSmartPointer.h" #include "itkImageProcessorHelpers.h" #include "itkQtIterationUpdate.h" #include "itkReg23MetaInformation.h" namespace itk{ class ITK_EXPORT itkReg23 : public itk::Object { public: /** Standard "Self" typedef. */ typedef itkReg23 Self; /** Standard "Superclass" typedef. */ typedef Object Superclass; /** Smart pointer typedef support */ typedef itk::SmartPointer Pointer; typedef itk::SmartPointer ConstPointer; /** Method of creation through the object factory. */ itkNewMacro(Self); /** Run-time type information (and related methods). */ itkTypeMacro(itkReg23, Object); using ChangeInformationFilterType = itk::ChangeInformationImageFilter; using RoiForRegistration = itk::ImageRegion; using InterpolatorType = itk::gSiddonJacobsRayCastInterpolateImageFunction; /* ---- User provided */ itkSetMacro(OptimizerObserver, CommandIterationUpdate::Pointer); itkGetMacro(OptimizerObserver, CommandIterationUpdate::Pointer); itkSetMacro(r23Meta, R23MetaInformation::Pointer); itkGetMacro(r23Meta, R23MetaInformation::Pointer); itkSetMacro(PowellMeta, PowellOptimizerMetaInformation::Pointer); itkGetMacro(PowellMeta, PowellOptimizerMetaInformation::Pointer); itkSetMacro(AmoebaMeta, AmoebaOptimizerMetaInformation::Pointer); itkGetMacro(AmoebaMeta, AmoebaOptimizerMetaInformation::Pointer); itkSetMacro(MIMeta, MIMetricMetaInformation::Pointer); itkGetMacro(MIMeta, MIMetricMetaInformation::Pointer); itkSetMacro(NCCMeta, NCCMetricMetaInformation::Pointer); itkGetMacro(NCCMeta, NCCMetricMetaInformation::Pointer); itkSetMacro(Volume, InternalImageType::Pointer); itkGetMacro(Volume, InternalImageType::Pointer); itkSetMacro(PA, InternalImageType::Pointer); itkGetMacro(PA, InternalImageType::Pointer); itkSetMacro(LAT, InternalImageType::Pointer); itkGetMacro(LAT, InternalImageType::Pointer); itkSetMacro(InternalTransf1, InternalTransformMetaInformation::Pointer); itkGetMacro(InternalTransf1, InternalTransformMetaInformation::Pointer); itkSetMacro(InternalTransf2, InternalTransformMetaInformation::Pointer); itkGetMacro(InternalTransf2, InternalTransformMetaInformation::Pointer); itkSetMacro(filter1, ChangeInformationFilterType::Pointer); itkGetMacro(filter1, ChangeInformationFilterType::Pointer); itkSetMacro(filter2, ChangeInformationFilterType::Pointer); itkGetMacro(filter2, ChangeInformationFilterType::Pointer); itkSetMacro(interpolator1, InterpolatorType::Pointer); itkGetMacro(interpolator1, InterpolatorType::Pointer); itkSetMacro(interpolator2, InterpolatorType::Pointer); itkGetMacro(interpolator2, InterpolatorType::Pointer); itkSetMacro(TransformMetaInfo, TransformMetaInformation::Pointer); itkGetMacro(TransformMetaInfo, TransformMetaInformation::Pointer); /* ---- User provided END */ itkSetMacro(roiAutoReg1, RoiForRegistration); itkGetMacro(roiAutoReg1, RoiForRegistration); itkSetMacro(roiAutoReg2, RoiForRegistration); itkGetMacro(roiAutoReg2, RoiForRegistration); /** Auto Reg23 methods */ /** Initialize the registration pipeline*/ void InitializeRegistration(); /** Start the registration process*/ int StartRegistration(std::string extraInfo); /** Get the current cost function value from the optimizer*/ double GetOptimizerValue(); /** Get the cost function value for the current transform*/ double GetCurrentMetricValue(); /** Get the cost function value for the current transform*/ Optimizer::ParametersType GetCurrentPosition(); /** Auto Reg23 methods END */ void setROISizeToZero(); protected: itkReg23(); virtual ~itkReg23(); void PrintSelf(std::ostream& os, itk::Indent indent) const; private: itkReg23(const Self&); //purposely not implemented void operator=(const Self&); //purposely not implemented /** Optimizer which tries to find the minimun (Powell Optimizer)*/ using PowellOptimizerType = itk::PowellOptimizer; /** Optimizer which tries to find the minimn (Powell Optimizer)*/ using AmoebaOptimizerType = itk::AmoebaOptimizer; /** Optimizer which samples the whol space */ using ExhaustiveOptimizerType = itk::ExhaustiveOptimizer; /** Metric to calculate similarites between images*/ using MetricType = itk::NormalizedCorrelationTwoImageToOneImageMetric; using MIMetricType = itk::MutualInformationTwoImageToOneImageMetric; /** The thing which actuall does the image registration*/ using RegistrationType = itk::TwoProjectionImageRegistrationMethod; RegistrationType::Pointer registration; MetricType::Pointer NCCmetric; MIMetricType::Pointer MImetric; PowellOptimizerType::Pointer PowellOptimizer; AmoebaOptimizerType::Pointer AmoebaOptimizer; ExhaustiveOptimizerType::Pointer ExhaustiveOptimizer; /* ---- User provided */ R23MetaInformation::Pointer m_r23Meta; PowellOptimizerMetaInformation::Pointer m_PowellMeta; AmoebaOptimizerMetaInformation::Pointer m_AmoebaMeta; MIMetricMetaInformation::Pointer m_MIMeta; NCCMetricMetaInformation::Pointer m_NCCMeta; InternalImageType::Pointer m_Volume, m_PA, m_LAT; InternalTransformMetaInformation::Pointer m_InternalTransf1, m_InternalTransf2; ChangeInformationFilterType::Pointer m_filter1, m_filter2; InterpolatorType::Pointer m_interpolator1, m_interpolator2; TransformMetaInformation::Pointer m_TransformMetaInfo; CommandIterationUpdate::Pointer m_OptimizerObserver; /* ---- User provided END */ TransformType::Pointer IsocTransform, Transform1, Transform2; RoiForRegistration m_roiAutoReg1, m_roiAutoReg2; bool m_UseDumptoFile; double m_OptmizerValue; }; } #endif