18 #ifndef itkImageToImageMetric_h
19 #define itkImageToImageMetric_h
53 template <
typename TFixedImage,
typename TMovingImage>
83 static constexpr
unsigned int MovingImageDimension = TMovingImage::ImageDimension;
84 static constexpr
unsigned int FixedImageDimension = TFixedImage::ImageDimension;
130 using typename Superclass::MeasureType;
133 using typename Superclass::DerivativeType;
136 using typename Superclass::ParametersType;
164 return this->GetNumberOfPixelsCounted();
167 itkGetConstReferenceMacro(NumberOfPixelsCounted,
SizeValueType);
171 SetFixedImageRegion(
const FixedImageRegionType reg);
174 itkGetConstReferenceMacro(FixedImageRegion, FixedImageRegionType);
177 itkSetObjectMacro(MovingImageMask, MovingImageMaskType);
178 itkSetConstObjectMacro(MovingImageMask, MovingImageMaskType);
179 itkGetConstObjectMacro(MovingImageMask, MovingImageMaskType);
183 itkSetObjectMacro(FixedImageMask, FixedImageMaskType);
184 itkSetConstObjectMacro(FixedImageMask, FixedImageMaskType);
185 itkGetConstObjectMacro(FixedImageMask, FixedImageMaskType);
191 SetFixedImageIndexes(
const FixedImageIndexContainer & indexes);
194 SetUseFixedImageIndexes(
bool useIndexes);
196 itkGetConstReferenceMacro(UseFixedImageIndexes,
bool);
201 itkGetConstReferenceMacro(NumberOfWorkUnits,
ThreadIdType);
205 itkSetMacro(ComputeGradient,
bool);
206 itkGetConstReferenceMacro(ComputeGradient,
bool);
207 itkBooleanMacro(ComputeGradient);
215 itkGetModifiableObjectMacro(GradientImage, GradientImageType);
219 SetTransformParameters(
const ParametersType & parameters)
const;
225 return m_Transform->GetNumberOfParameters();
234 MultiThreadingInitialize();
242 itkGetConstReferenceMacro(NumberOfFixedImageSamples,
SizeValueType);
250 this->SetNumberOfFixedImageSamples(num);
256 return this->GetNumberOfFixedImageSamples();
262 SetFixedImageSamplesIntensityThreshold(
const FixedImagePixelType & thresh);
264 itkGetConstReferenceMacro(FixedImageSamplesIntensityThreshold, FixedImagePixelType);
267 SetUseFixedImageSamplesIntensityThreshold(
bool useThresh);
269 itkGetConstReferenceMacro(UseFixedImageSamplesIntensityThreshold,
bool);
275 SetUseAllPixels(
bool useAllPixels);
280 this->SetUseAllPixels(
true);
286 this->SetUseAllPixels(
false);
289 itkGetConstReferenceMacro(UseAllPixels,
bool);
296 SetUseSequentialSampling(
bool useSequential);
298 itkGetConstReferenceMacro(UseSequentialSampling,
bool);
312 ReinitializeSeed(
int seed);
331 itkSetMacro(UseCachingOfBSplineWeights,
bool);
332 itkGetConstReferenceMacro(UseCachingOfBSplineWeights,
bool);
333 itkBooleanMacro(UseCachingOfBSplineWeights);
342 return m_ThreaderTransform.get();
351 PrintSelf(std::ostream & os,
Indent indent)
const override;
370 inline friend std::ostream &
374 os <<
"value: " << val.
value << std::endl;
375 os <<
"valueIndex: " << val.
valueIndex << std::endl;
386 bool m_UseFixedImageIndexes{
false };
389 bool m_UseFixedImageSamplesIntensityThreshold{
false };
436 bool m_ComputeGradient{
true };
444 bool m_UseAllPixels{
false };
445 bool m_UseSequentialSampling{
false };
447 bool m_ReseedIterator{
false };
449 mutable int m_RandomSeed{};
458 bool m_TransformIsBSpline{
false };
464 static constexpr
unsigned int DeformationSplineOrder = 3;
502 bool m_UseCachingOfBSplineWeights{
true };
511 PreComputeTransformValues();
518 TransformPoint(
unsigned int sampleNumber,
521 double & movingImageValue,
529 TransformPointWithDerivatives(
unsigned int sampleNumber,
532 double & movingImageValue,
537 bool m_InterpolatorIsBSpline{
false };
549 ComputeImageDerivatives(
const MovingImagePointType & mappedPoint,
550 ImageDerivativesType & gradient,
569 : m_ConstMetricPointer{ i2i_metricPointer }
574 return m_ConstMetricPointer;
593 : m_WorkUnitInfo(static_cast<const typename
MultiThreaderType::WorkUnitInfo *>(workunitInfoAsVoid))
598 return m_WorkUnitInfo->WorkUnitID;
603 return (static_cast<ConstantPointerWrapper *>(m_WorkUnitInfo->UserData))->GetConstMetricPointer();
614 bool m_WithinThreadPreProcess{
false };
615 bool m_WithinThreadPostProcess{
false };
618 GetValueMultiThreadedInitiate()
const;
621 GetValueMultiThreadedPostProcessInitiate()
const;
625 GetValueMultiThreaded(
void * workunitInfoAsVoid);
629 GetValueMultiThreadedPostProcess(
void * workunitInfoAsVoid);
643 double itkNotUsed(movingImageValue))
const
653 GetValueAndDerivativeMultiThreadedInitiate()
const;
656 GetValueAndDerivativeMultiThreadedPostProcessInitiate()
const;
659 GetValueAndDerivativeMultiThreaded(
void * workunitInfoAsVoid);
662 GetValueAndDerivativeMultiThreadedPostProcess(
void * workunitInfoAsVoid);
665 GetValueAndDerivativeThread(
ThreadIdType threadId)
const;
674 double itkNotUsed(movingImageValue),
689 SynchronizeTransforms()
const;
696 #ifndef ITK_MANUAL_INSTANTIATION
697 # include "itkImageToImageMetric.hxx"