/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkImageToSpatialObjectRegistrationMethod_hxx #define itkImageToSpatialObjectRegistrationMethod_hxx namespace itk { template ImageToSpatialObjectRegistrationMethod::ImageToSpatialObjectRegistrationMethod() { this->SetNumberOfRequiredOutputs(1); // for the Transform m_FixedImage = nullptr; // has to be provided by the user m_MovingSpatialObject = nullptr; // has to be provided by the user m_Transform = nullptr; // has to be provided by the user m_Interpolator = nullptr; // has to be provided by the user m_Metric = nullptr; // has to be provided by the user m_Optimizer = nullptr; // has to be provided by the user m_InitialTransformParameters = ParametersType(1); m_LastTransformParameters = ParametersType(1); m_InitialTransformParameters.Fill(0.0f); m_LastTransformParameters.Fill(0.0f); TransformOutputPointer transformDecorator = itkDynamicCastInDebugMode(this->MakeOutput(0).GetPointer()); this->ProcessObject::SetNthOutput(0, transformDecorator.GetPointer()); } template void ImageToSpatialObjectRegistrationMethod::Initialize() { if (!m_FixedImage) { itkExceptionMacro("FixedImage is not present"); } if (!m_MovingSpatialObject) { itkExceptionMacro("MovingSpatialObject is not present"); } if (!m_Metric) { itkExceptionMacro("Metric is not present"); } if (!m_Optimizer) { itkExceptionMacro("Optimizer is not present"); } if (!m_Transform) { itkExceptionMacro("Transform is not present"); } if (!m_Interpolator) { itkExceptionMacro("Interpolator is not present"); } m_Interpolator->SetInputImage(m_FixedImage); // Set up the metric m_Metric->SetFixedImage(m_FixedImage); m_Metric->SetMovingSpatialObject(m_MovingSpatialObject); m_Metric->SetTransform(m_Transform); m_Metric->SetInterpolator(m_Interpolator); m_Metric->Initialize(); // Set up the optimizer m_Optimizer->SetCostFunction(m_Metric); // Validate initial transform parameters if (m_InitialTransformParameters.Size() != m_Metric->GetNumberOfParameters()) { itkWarningMacro(" WARNING : Size mismatch between initial parameter and transform"); itkWarningMacro("Resizing m_InitialTransformParameters to " << m_Transform->GetNumberOfParameters()); m_InitialTransformParameters.set_size(m_Transform->GetNumberOfParameters()); m_InitialTransformParameters.Fill(0.0f); } if (m_LastTransformParameters.Size() != m_Transform->GetNumberOfParameters()) { m_LastTransformParameters.set_size(m_Transform->GetNumberOfParameters()); m_LastTransformParameters.Fill(0.0f); } m_Optimizer->SetInitialPosition(m_InitialTransformParameters); // Connect the transform to the Decorator auto * transformOutput = static_cast(this->ProcessObject::GetOutput(0)); transformOutput->Set(m_Transform); } template void ImageToSpatialObjectRegistrationMethod::GenerateData() { try { // Initialize the interconnects between components this->Initialize(); } catch (const ExceptionObject &) { // Pass exception to caller throw; } try { // Do the optimization m_Optimizer->StartOptimization(); } catch (const ExceptionObject &) { // An error has occurred in the optimization. // Update the parameters m_LastTransformParameters = m_Optimizer->GetCurrentPosition(); // Pass exception to caller throw; } // Get the results m_LastTransformParameters = m_Optimizer->GetCurrentPosition(); } template auto ImageToSpatialObjectRegistrationMethod::GetOutput() const -> const TransformOutputType * { return static_cast(this->ProcessObject::GetOutput(0)); } template DataObject::Pointer ImageToSpatialObjectRegistrationMethod::MakeOutput( DataObjectPointerArraySizeType output) { if (output > 0) { itkExceptionMacro("MakeOutput request for an output number larger than the expected number of outputs."); } return TransformOutputType::New().GetPointer(); } template ModifiedTimeType ImageToSpatialObjectRegistrationMethod::GetMTime() const { ModifiedTimeType mtime = Superclass::GetMTime(); ModifiedTimeType m; // Some of the following should be removed once ivars are put in the // input and output lists if (m_Transform) { m = m_Transform->GetMTime(); mtime = (m > mtime ? m : mtime); } if (m_Interpolator) { m = m_Interpolator->GetMTime(); mtime = (m > mtime ? m : mtime); } if (m_Metric) { m = m_Metric->GetMTime(); mtime = (m > mtime ? m : mtime); } if (m_Optimizer) { m = m_Optimizer->GetMTime(); mtime = (m > mtime ? m : mtime); } if (m_FixedImage) { m = m_FixedImage->GetMTime(); mtime = (m > mtime ? m : mtime); } if (m_MovingSpatialObject) { m = m_MovingSpatialObject->GetMTime(); mtime = (m > mtime ? m : mtime); } return mtime; } template void ImageToSpatialObjectRegistrationMethod::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); os << indent << "Metric: " << m_Metric.GetPointer() << std::endl; os << indent << "Optimizer: " << m_Optimizer.GetPointer() << std::endl; os << indent << "Transform: " << m_Transform.GetPointer() << std::endl; os << indent << "Interpolator: " << m_Interpolator.GetPointer() << std::endl; os << indent << "Fixed Image: " << m_FixedImage.GetPointer() << std::endl; os << indent << "Moving SpatialObject: " << m_MovingSpatialObject.GetPointer() << std::endl; os << indent << "Initial Transform Parameters: " << m_InitialTransformParameters << std::endl; os << indent << "Last Transform Parameters: " << m_LastTransformParameters << std::endl; } } // end namespace itk #endif