diff --git a/Code/Projections/otbGenericRSResampleImageFilter.txx b/Code/Projections/otbGenericRSResampleImageFilter.txx index 5f633b0b51b3a878fe4788926be0a4d268111112..08ce77ebac4c6b8c34e5b05420453fe88080cce3 100644 --- a/Code/Projections/otbGenericRSResampleImageFilter.txx +++ b/Code/Projections/otbGenericRSResampleImageFilter.txx @@ -73,7 +73,7 @@ GenericRSResampleImageFilter<TInputImage, TOutputImage, TDeformationField> // resampler output parameters m_Resampler->SetOutputSize(m_OutputSize); m_Resampler->SetOutputSpacing(m_OutputSpacing); - m_Resampler->SetOutputIndex(m_OutputIndex); + m_Resampler->SetOutputStartIndex(m_OutputIndex); m_Resampler->SetOutputOrigin(m_OutputOrigin); // expose the metadata to the output of the resample filter diff --git a/Code/Projections/otbOptResampleImageFilter.h b/Code/Projections/otbOptResampleImageFilter.h index 408198fd38c757e616aebc8f322c4b21f8cfd3af..23434dcc0a0f6cc5a7071bb15d6d7d472f316a09 100644 --- a/Code/Projections/otbOptResampleImageFilter.h +++ b/Code/Projections/otbOptResampleImageFilter.h @@ -25,6 +25,8 @@ #include "itkInterpolateImageFunction.h" #include "itkVector.h" +#include "otbMacro.h" + namespace otb { @@ -92,59 +94,73 @@ public: virtual void GenerateData(); /** Accessors to internal filters parameters */ - itkSetObjectMacro(Transform,TransformType); + void SetTransform(TransformType * transform) + { + m_DeformationFilter->SetTransform(transform); + this->Modified(); + } + otbGetObjectMemberConstMacro(DeformationFilter,Transform,const TransformType*); /** The Deformation field spacing & size */ - itkSetMacro(DeformationFieldSpacing,SpacingType); - + void SetDeformationFieldSpacing(const SpacingType & spacing) + { + m_DeformationFilter->SetOutputSpacing(spacing); + this->Modified(); + } + const SpacingType & GetDeformationFieldSpacing() const + { + return m_DeformationFilter->GetOutputSpacing(); + } + /** The resampled image parameters */ // Output Origin - itkSetMacro(OutputOrigin,OriginType); - itkGetMacro(OutputOrigin,OriginType); + void SetOutputOrigin(const OriginType & origin) + { + m_DeformationFilter->SetOutputOrigin(origin); + m_WarpFilter->SetOutputOrigin(origin); + this->Modified(); + } + otbGetObjectMemberConstReferenceMacro(WarpFilter,OutputOrigin,OriginType); + // Output Start index - itkSetMacro(OutputIndex,IndexType); - itkGetMacro(OutputIndex,IndexType); + otbSetObjectMemberMacro(WarpFilter,OutputStartIndex,IndexType); + otbGetObjectMemberConstReferenceMacro(WarpFilter,OutputStartIndex,IndexType); + // Output Size - itkSetMacro(OutputSize,SizeType); - itkGetMacro(OutputSize,SizeType); - // Output Spacing - itkSetMacro(OutputSpacing,SpacingType); - itkGetMacro(OutputSpacing,SpacingType); + otbSetObjectMemberMacro(WarpFilter,OutputSize,SizeType); + otbGetObjectMemberConstReferenceMacro(WarpFilter,OutputSize,SizeType); - /** Get the deformation grid generated */ - virtual DeformationFieldType * GetDeformationField(); + // Output Spacing + otbSetObjectMemberMacro(WarpFilter,OutputSpacing,SpacingType); + otbGetObjectMemberConstReferenceMacro(WarpFilter,OutputSpacing,SpacingType); /** Methods to Set/Get the interpolator */ - itkSetObjectMacro( Interpolator, InterpolatorType ); - itkGetObjectMacro( Interpolator, InterpolatorType ); - - virtual void GenerateOutputInformation(); - - virtual void GenerateInputRequestedRegion(); - + void SetInterpolator(InterpolatorType * interpolator) + { + m_WarpFilter->SetInterpolator(interpolator); + this->Modified(); + } + otbGetObjectMemberConstMacro(WarpFilter, Interpolator, const InterpolatorType *); + + /** Import output parameters from a given image */ void SetOutputParametersFromImage(const InputImageType * image); protected: OptResampleImageFilter(); + /** Destructor */ virtual ~OptResampleImageFilter() {}; + virtual void GenerateOutputInformation(); + + virtual void GenerateInputRequestedRegion(); + private: OptResampleImageFilter(const Self &); //purposely not implemented void operator =(const Self&); //purposely not implemented DeformationFieldGeneratorPointerType m_DeformationFilter; - typename TransformType::Pointer m_Transform; - - SizeType m_DeformationGridSize; - SpacingType m_DeformationFieldSpacing; - SizeType m_OutputSize; - OriginType m_OutputOrigin; - IndexType m_OutputIndex; - SpacingType m_OutputSpacing; - typename WarpImageFilterType::Pointer m_WarpFilter; - InterpolatorPointerType m_Interpolator; }; } // namespace otb diff --git a/Code/Projections/otbOptResampleImageFilter.txx b/Code/Projections/otbOptResampleImageFilter.txx index 147731c8adb59b2ed3008aedbcf88f63ed25eb4b..38ea75192171d7e3cd303be6a8482c8eba5b221c 100644 --- a/Code/Projections/otbOptResampleImageFilter.txx +++ b/Code/Projections/otbOptResampleImageFilter.txx @@ -31,84 +31,25 @@ template <class TInputImage, class TOutputImage, class TDeformationField> OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField> ::OptResampleImageFilter() { - // default values for DeformationGrid - m_DeformationGridSize.Fill(1); - m_DeformationFieldSpacing.Fill(2); - - // default values for Resampled Image - m_OutputSize.Fill(1); - m_OutputOrigin.Fill(0); - m_OutputIndex.Fill(0); - m_OutputSpacing.Fill(1); - // internal filters instanciation m_DeformationFilter = DeformationFieldGeneratorType::New(); m_WarpFilter = WarpImageFilterType::New(); - // default identity transform - m_Transform = itk::IdentityTransform<double ,InputImageType::ImageDimension >::New(); - - // Setup default interpolator - typename DefaultInterpolatorType::Pointer interp = DefaultInterpolatorType::New(); - m_Interpolator = static_cast<InterpolatorType*>( interp.GetPointer() ); -} - -template <class TInputImage, class TOutputImage, class TDeformationField> -typename OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField>::DeformationFieldType* -OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField> -::GetDeformationField() -{ - return m_DeformationFilter->GetOutput(); + // Wire minipipeline + m_WarpFilter->SetDeformationField(m_DeformationFilter->GetOutput()); } - template <class TInputImage, class TOutputImage, class TDeformationField> void OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField> ::GenerateData() { - // Get the input image - typename InputImageType::Pointer input = const_cast<InputImageType *>(this->GetInput()); - typename OutputImageType::Pointer output = this->GetOutput(); - - - // Build the deformation field - m_DeformationFilter->SetTransform(m_Transform); - m_DeformationFilter->SetOutputIndex(output->GetLargestPossibleRegion().GetIndex()); - m_DeformationFilter->SetOutputOrigin(output->GetOrigin()); - m_DeformationFilter->SetOutputSpacing(m_DeformationFieldSpacing); - - // Build the deformation field size following the - // m_DeformationFieldSpacing set by the user - SizeType size = output->GetLargestPossibleRegion().GetSize(); - SpacingType spacing = output->GetSpacing(); - - for (unsigned int dim = 0; dim < InputImageType::ImageDimension;++dim) - { - m_DeformationGridSize[dim] = static_cast<unsigned long>(size[dim]*vcl_abs(spacing[dim]/m_DeformationFieldSpacing[dim])); - } - m_DeformationFilter->SetOutputSize(m_DeformationGridSize); - - // Apply the streamed warp filter to the input image using the - // deformation field generated before - m_WarpFilter->SetInput(input); - m_WarpFilter->SetOutputOrigin(m_OutputOrigin); - m_WarpFilter->SetOutputSpacing(m_OutputSpacing); - m_WarpFilter->SetOutputSize(m_OutputSize); - m_WarpFilter->SetOutputStartIndex(m_OutputIndex); - - // Set the deformation field and the interpolator - m_WarpFilter->SetDeformationField(m_DeformationFilter->GetOutput()); - m_WarpFilter->SetInterpolator(m_Interpolator); - m_WarpFilter->GraftOutput(this->GetOutput()); m_WarpFilter->Update(); this->GraftOutput(m_WarpFilter->GetOutput()); } - /** - * * */ template <class TInputImage, class TOutputImage, class TDeformationField> @@ -121,12 +62,12 @@ OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField> typename OutputImageType::Pointer outputPtr = this->GetOutput(); - outputPtr->SetSpacing( m_OutputSpacing ); - outputPtr->SetOrigin( m_OutputOrigin ); + outputPtr->SetSpacing( this->GetOutputSpacing() ); + outputPtr->SetOrigin( this->GetOutputOrigin() ); typename OutputImageType::RegionType region; - region.SetSize(m_OutputSize); - region.SetIndex(m_OutputIndex); + region.SetSize( this->GetOutputSize() ); + region.SetIndex(this->GetOutputStartIndex() ); outputPtr->SetLargestPossibleRegion(region); @@ -142,45 +83,33 @@ void OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField> ::GenerateInputRequestedRegion() { - // call the superclass's implementation - Superclass::GenerateInputRequestedRegion(); - - // Load Input - typename InputImageType::Pointer inputPtr = const_cast<InputImageType*>(this->GetInput()); - // Load Output - typename OutputImageType::Pointer outputPtr = this->GetOutput(); + // Retrieve output pointer + OutputImageType * outputPtr = this->GetOutput(); - // Compute the subsampling rate - SizeType inputSize = inputPtr->GetLargestPossibleRegion().GetSize(); - SizeType outputSize = outputPtr->GetLargestPossibleRegion().GetSize(); + // Retrieve input pointer + const InputImageType * inputPtr = this->GetInput(); - SpacingType spacing = inputPtr->GetSpacing(); - - std::vector<double> rate(0.); - rate[0] = static_cast<double>(inputSize[0])/static_cast<double>(outputSize[0]); - rate[1] = static_cast<double>(inputSize[1])/static_cast<double>(outputSize[1]); + // Retrieve output requested region + RegionType requestedRegion = outputPtr->GetRequestedRegion(); + SizeType largestSize = outputPtr->GetLargestPossibleRegion().GetSize(); - // Get the output dimensions - SizeType lOutputSize = outputPtr->GetRequestedRegion().GetSize(); - IndexType lOutputIndex = outputPtr->GetRequestedRegion().GetIndex(); - - // Compute the input informations - SizeType lInputSize; - IndexType lInputIndex; - for (unsigned int i=0; i<InputImageType::ImageDimension ;i ++) + // Set up deformation field filter + SizeType deformationFieldLargestSize; + for(unsigned int dim = 0; dim < InputImageType::ImageDimension;++dim) { - lInputSize[i] = static_cast<unsigned int>(vcl_ceil( lOutputSize[i] * rate[i]) ); - lInputIndex[i] = static_cast<unsigned int>(vcl_ceil( lOutputIndex[i] * rate[i]) ); + deformationFieldLargestSize[dim] = static_cast<unsigned long>(largestSize[dim] + *vcl_abs(this->GetDeformationFieldSpacing()[dim] + /this->GetOutputSpacing()[dim])); } - - RegionType lInputRegion; - lInputRegion.SetSize(lInputSize); - lInputRegion.SetIndex(lInputIndex); - - lInputRegion.Crop(outputPtr->GetLargestPossibleRegion()); - // Set input resolution input regions - inputPtr->SetRequestedRegion(lInputRegion); + m_DeformationFilter->SetOutputSize(deformationFieldLargestSize); + m_DeformationFilter->SetOutputIndex(this->GetOutputStartIndex()); + + // Generate input requested region + m_WarpFilter->SetInput(inputPtr); + m_WarpFilter->GetOutput()->UpdateOutputInformation(); + m_WarpFilter->GetOutput()->SetRequestedRegion(requestedRegion); + m_WarpFilter->GetOutput()->PropagateRequestedRegion(); } /** @@ -194,7 +123,7 @@ OptResampleImageFilter<TInputImage, TOutputImage, TDeformationField> { this->SetOutputOrigin ( image->GetOrigin() ); this->SetOutputSpacing ( image->GetSpacing() ); - this->SetOutputIndex ( image->GetLargestPossibleRegion().GetIndex() ); + this->SetOutputStartIndex ( image->GetLargestPossibleRegion().GetIndex() ); this->SetOutputSize ( image->GetLargestPossibleRegion().GetSize() ); } diff --git a/Testing/Code/Projections/otbOptResampleImageFilter.cxx b/Testing/Code/Projections/otbOptResampleImageFilter.cxx index d957ec6e60da88cff3db79559a307a1a4a4433f7..fbe845e4e6e86e8a65f68b172eb9782fd5e72022 100644 --- a/Testing/Code/Projections/otbOptResampleImageFilter.cxx +++ b/Testing/Code/Projections/otbOptResampleImageFilter.cxx @@ -94,7 +94,7 @@ int otbOptResampleImageFilter(int argc, char* argv[]) // Write the resampled image typedef otb::StreamingImageFileWriter<ImageType> WriterType; WriterType::Pointer writer= WriterType::New(); - writer->SetTilingStreamDivisions(); + writer->SetTilingStreamDivisions(4); writer->WriteGeomFileOn(); writer->SetFileName(outfname); writer->SetInput(resampler->GetOutput());