@@ -67,6 +67,7 @@ ANTSRegistration<TFixedImage, TMovingImage, TParametersValueType>::PrintSelf(std
6767 os << indent << " Radius: " << this ->m_Radius << std::endl;
6868 os << indent << " CollapseCompositeTransform: " << (this ->m_CollapseCompositeTransform ? " On" : " Off" ) << std::endl;
6969 os << indent << " MaskAllStages: " << (this ->m_MaskAllStages ? " On" : " Off" ) << std::endl;
70+ os << indent << " DisplacementFieldSubsamplingFactor: " << this ->m_DisplacementFieldSubsamplingFactor << std::endl;
7071
7172 os << indent << " SynIterations: " << this ->m_SynIterations << std::endl;
7273 os << indent << " AffineIterations: " << this ->m_AffineIterations << std::endl;
@@ -257,8 +258,8 @@ ANTSRegistration<TFixedImage, TMovingImage, TParametersValueType>::MakeOutput(Da
257258template <typename TFixedImage, typename TMovingImage, typename TParametersValueType>
258259template <typename TImage>
259260auto
260- ANTSRegistration<TFixedImage, TMovingImage, TParametersValueType>::CastImageToInternalType(
261- const TImage * inputImage) -> typename InternalImageType::Pointer
261+ ANTSRegistration<TFixedImage, TMovingImage, TParametersValueType>::CastImageToInternalType(const TImage * inputImage) ->
262+ typename InternalImageType::Pointer
262263{
263264 using CastFilterType = CastImageFilter<TImage, InternalImageType>;
264265 typename CastFilterType::Pointer castFilter = CastFilterType::New ();
@@ -606,7 +607,7 @@ ANTSRegistration<TFixedImage, TMovingImage, TParametersValueType>::GenerateData(
606607 {
607608 itkExceptionMacro (<< " Unsupported transform type: " << this ->GetTypeOfTransform ());
608609 }
609- this ->UpdateProgress (0.95 );
610+ this ->UpdateProgress (0.90 );
610611
611612 typename OutputTransformType::Pointer forwardTransform = m_Helper->GetModifiableCompositeTransform ();
612613 if (m_CollapseCompositeTransform)
@@ -615,6 +616,41 @@ ANTSRegistration<TFixedImage, TMovingImage, TParametersValueType>::GenerateData(
615616 }
616617 this ->SetForwardTransform (forwardTransform);
617618
619+ if (m_DisplacementFieldSubsamplingFactor > 1 )
620+ {
621+ using TransformType = typename OutputTransformType::TransformType;
622+ for (unsigned int i = 0 ; i < forwardTransform->GetNumberOfTransforms (); ++i)
623+ {
624+ typename TransformType::Pointer transform = forwardTransform->GetNthTransform (i);
625+ typename DisplacementFieldTransformType::Pointer displacementFieldTransform =
626+ dynamic_cast <DisplacementFieldTransformType *>(transform.GetPointer ());
627+ if (displacementFieldTransform)
628+ {
629+ // The transform is a DisplacementFieldTransform
630+ displacementFieldTransform->Print (std::cout, 3 );
631+ const auto displacementField = displacementFieldTransform->GetDisplacementField ();
632+ m_DisplacementFieldAdaptor->SetTransform (displacementFieldTransform);
633+ m_DisplacementFieldAdaptor->SetRequiredOrigin (displacementField->GetOrigin ());
634+ m_DisplacementFieldAdaptor->SetRequiredDirection (displacementField->GetDirection ());
635+ auto requiredSize = displacementField->GetLargestPossibleRegion ().GetSize ();
636+ for (unsigned int i = 0 ; i < requiredSize.GetSizeDimension (); ++i)
637+ {
638+ requiredSize[i] /= m_DisplacementFieldSubsamplingFactor;
639+ }
640+ m_DisplacementFieldAdaptor->SetRequiredSize (requiredSize);
641+ auto requiredSpacing = displacementField->GetSpacing ();
642+ for (unsigned int i = 0 ; i < requiredSpacing.GetVectorDimension (); ++i)
643+ {
644+ requiredSpacing[i] *= m_DisplacementFieldSubsamplingFactor;
645+ }
646+ m_DisplacementFieldAdaptor->SetRequiredSpacing (requiredSpacing);
647+ m_DisplacementFieldAdaptor->AdaptTransformParameters ();
648+ displacementFieldTransform->Print (std::cout, 3 );
649+ }
650+ }
651+ }
652+ this ->UpdateProgress (0.95 );
653+
618654 typename OutputTransformType::Pointer inverseTransform = OutputTransformType::New ();
619655 if (forwardTransform->GetInverse (inverseTransform))
620656 {
0 commit comments