#ifndef _itkStationaryVelocityFieldTransform_cxx_ #define _itkStationaryVelocityFieldTransform_cxx_ #include "itkStationaryVelocityFieldTransform.h" #include #include #include #include #include #include #include #include #include #include namespace itk { template StationaryVelocityFieldTransform:: StationaryVelocityFieldTransform() : Superclass( ParametersDimension ) { this->m_InterpolateFunction = InterpolateFunctionType::New(); } template void StationaryVelocityFieldTransform:: SetIdentity(void) { itk::Vector value; value.Fill(0); VectorFieldPointerType field = VectorFieldType::New(); field->Allocate(); field->FillBuffer(value); field->Register(); this->m_VectorField = field; } template void StationaryVelocityFieldTransform:: PrintSelf(std::ostream &os, Indent indent) const { Superclass::PrintSelf(os,indent); } template const typename StationaryVelocityFieldTransform::VectorFieldType * StationaryVelocityFieldTransform:: GetParametersAsVectorField(void) const { return this->m_VectorField.GetPointer(); } template void StationaryVelocityFieldTransform:: SetParametersAsVectorField(const VectorFieldType * field) { this->m_VectorField = field; this->m_InterpolateFunction->SetInputImage(this->m_VectorField); this->Modified(); } template bool StationaryVelocityFieldTransform:: GetInverse( Self* inverse ) const { // Initial field VectorFieldConstPointerType initial_field = this->m_VectorField; // Initialize the field inverter typedef itk::MultiplyImageFilter, VectorFieldType> FilterType; typename FilterType::Pointer filter = FilterType::New(); filter->SetInput( initial_field ); filter->SetConstant( -1 ); filter->SetInPlace( false); // Update the filter filter->UpdateLargestPossibleRegion(); // Get the inverted field and set the orientation that has been lost VectorFieldPointerType inverted_field = filter->GetOutput(); inverted_field->SetDirection( initial_field->GetDirection() ); // Set the displacement field to the current objet inverse->SetParametersAsVectorField( inverted_field ); return true; } template typename StationaryVelocityFieldTransform::InverseTransformBasePointer StationaryVelocityFieldTransform:: GetInverseTransform() const { Pointer inv = New(); return GetInverse(inv) ? inv.GetPointer() : NULL; } template typename StationaryVelocityFieldTransform::OutputPointType StationaryVelocityFieldTransform:: TransformPoint(const InputPointType & point) const { double minpixelspacing = m_VectorField->GetSpacing()[0]; for (unsigned int i = 0; i<3; ++i) { if ( m_VectorField->GetSpacing()[i] < minpixelspacing/2 ) { minpixelspacing = m_VectorField->GetSpacing()[i]; } } typedef typename itk::ImageRegionIterator IteratorType; IteratorType InputIt(const_cast(m_VectorField.GetPointer()), m_VectorField->GetRequestedRegion()); float norm2,maxnorm2=0; for( InputIt.GoToBegin(); !InputIt.IsAtEnd(); ++InputIt ) { norm2 = InputIt.Get().GetSquaredNorm(); if (maxnorm2 0) numiter = static_cast(numiterfloat + 1.0); unsigned int constant = 1<,VectorFieldType> DividerType; typename DividerType::Pointer Divider=DividerType::New(); Divider->SetInput(m_VectorField); Divider->SetConstant( constant ); Divider->Update(); VectorFieldPointerType UpdatedVector = Divider->GetOutput(); typedef typename itk::WarpVectorImageFilter VectorWarperType; typename VectorWarperType::Pointer VectorWarper=VectorWarperType::New(); VectorWarper->SetOutputOrigin(UpdatedVector->GetOrigin()); VectorWarper->SetOutputSpacing(UpdatedVector->GetSpacing()); VectorWarper->SetOutputDirection(UpdatedVector->GetDirection()); OutputPointType output = point; for (unsigned int i =0; i < constant;++i) { this->m_InterpolateFunction->SetInputImage(UpdatedVector); typename InterpolateFunctionType::OutputType vector = m_InterpolateFunction->Evaluate(output); for (unsigned int i=0; iSetInput(UpdatedVector); VectorWarper->SetDisplacementField(UpdatedVector); VectorWarper->Update(); UpdatedVector=VectorWarper->GetOutput(); UpdatedVector->DisconnectPipeline(); } return output; } template typename StationaryVelocityFieldTransform::OutputVectorType StationaryVelocityFieldTransform:: TransformVector(const InputVectorType & vector) const { // Convert vector into point InputPointType point_0; for (unsigned int i=0; i typename StationaryVelocityFieldTransform::OutputVnlVectorType StationaryVelocityFieldTransform::TransformVector (const InputVnlVectorType & vector) const { // Convert vector into point InputPointType point_0; for (unsigned int i=0; i typename StationaryVelocityFieldTransform::VectorFieldPointerType StationaryVelocityFieldTransform:: GetDisplacementFieldAsVectorField(typename SVFExponentialType::NumericalScheme scheme) const { typename SVFExponentialType::Pointer exp = SVFExponentialType::New(); exp->SetInput( this->m_VectorField ); exp->SetIterativeScheme( scheme ); exp->UpdateLargestPossibleRegion(); return exp->GetOutput(); } template typename StationaryVelocityFieldTransform::ScalarImagePointerType StationaryVelocityFieldTransform:: GetLogSpatialJacobianDeterminant(typename SVFExponentialType::NumericalScheme scheme) const { typename SVFExponentialType::Pointer exp = SVFExponentialType::New(); exp->SetInput( this->m_VectorField ); exp->SetIterativeScheme( scheme ); exp->UpdateLargestPossibleRegion(); return exp->GetLogJacobianDeterminant(); } template typename StationaryVelocityFieldTransform::OriginType StationaryVelocityFieldTransform:: GetOrigin(void) const { if (this->m_VectorField.IsNull()) itkExceptionMacro("No field has been set."); return this->m_VectorField->GetOrigin(); } template typename StationaryVelocityFieldTransform::SpacingType StationaryVelocityFieldTransform:: GetSpacing(void) const { if (this->m_VectorField.IsNull()) itkExceptionMacro("No field has been set."); return this->m_VectorField->GetSpacing(); } template typename StationaryVelocityFieldTransform::DirectionType StationaryVelocityFieldTransform:: GetDirection(void) const { if (this->m_VectorField.IsNull()) itkExceptionMacro("No field has been set."); return this->m_VectorField->GetDirection(); } template typename StationaryVelocityFieldTransform::RegionType StationaryVelocityFieldTransform:: GetLargestPossibleRegion(void) const { if (this->m_VectorField.IsNull()) itkExceptionMacro("No field has been set."); return this->m_VectorField->GetLargestPossibleRegion(); } } // namespace #endif // _itkStationaryVelocityFieldTransform_cxx_