/*========================================================================= Program: Insight Segmentation & Registration Toolkit Module: $RCSfile: itkSmoothingRecursiveGaussianImageFilterMod.txx,v $ Language: C++ Date: $Date: 2006/08/01 19:16:18 $ Version: $Revision: 1.9 $ Copyright (c) Insight Software Consortium. All rights reserved. See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef _itkSmoothingRecursiveGaussianImageFilterMod_txx #define _itkSmoothingRecursiveGaussianImageFilterMod_txx #include "itkSmoothingRecursiveGaussianImageFilterMod.h" #include "itkImageRegionIteratorWithIndex.h" #include "itkProgressAccumulator.h" namespace itk { /** * Constructor */ template SmoothingRecursiveGaussianImageFilterMod ::SmoothingRecursiveGaussianImageFilterMod() { m_NormalizeAcrossScale = false; m_FirstSmoothingFilter = FirstGaussianFilterType::New(); m_FirstSmoothingFilter->SetOrder( FirstGaussianFilterType::ZeroOrder ); m_FirstSmoothingFilter->SetDirection( 0 ); m_FirstSmoothingFilter->SetNormalizeAcrossScale( m_NormalizeAcrossScale ); m_FirstSmoothingFilter->ReleaseDataFlagOn(); for( unsigned int i = 0; iSetOrder( InternalGaussianFilterType::ZeroOrder ); m_SmoothingFilters[ i ]->SetNormalizeAcrossScale( m_NormalizeAcrossScale ); m_SmoothingFilters[ i ]->SetDirection( i+1 ); m_SmoothingFilters[ i ]->ReleaseDataFlagOn(); } m_SmoothingFilters[0]->SetInput( m_FirstSmoothingFilter->GetOutput() ); for( unsigned int i = 1; iSetInput( m_SmoothingFilters[i-1]->GetOutput() ); } m_CastingFilter = CastingFilterType::New(); m_CastingFilter->SetInput(m_SmoothingFilters[ImageDimension-2]->GetOutput()); this->SetSigma( 1.0 ); } /** * Set value of Sigma */ template void SmoothingRecursiveGaussianImageFilterMod ::SetSigma( ScalarRealType sigma ) { for( unsigned int i = 0; iSetSigma( sigma ); } m_FirstSmoothingFilter->SetSigma( sigma ); this->Modified(); } /** * Set Normalize Across Scale Space */ template void SmoothingRecursiveGaussianImageFilterMod ::SetNormalizeAcrossScale( bool normalize ) { m_NormalizeAcrossScale = normalize; for( unsigned int i = 0; iSetNormalizeAcrossScale( normalize ); } m_FirstSmoothingFilter->SetNormalizeAcrossScale( normalize ); this->Modified(); } // // // template void SmoothingRecursiveGaussianImageFilterMod ::GenerateInputRequestedRegion() throw(InvalidRequestedRegionError) { // call the superclass' implementation of this method. this should // copy the output requested region to the input requested region Superclass::GenerateInputRequestedRegion(); // This filter needs all of the input typename SmoothingRecursiveGaussianImageFilterMod::InputImagePointer image = const_cast( this->GetInput() ); if( image ) { image->SetRequestedRegion( this->GetInput()->GetLargestPossibleRegion() ); } } // // // template void SmoothingRecursiveGaussianImageFilterMod ::EnlargeOutputRequestedRegion(DataObject *output) { TOutputImage *out = dynamic_cast(output); if (out) { out->SetRequestedRegion( out->GetLargestPossibleRegion() ); } } /** * Compute filter for Gaussian kernel */ template void SmoothingRecursiveGaussianImageFilterMod ::GenerateData(void) { itkDebugMacro(<< "SmoothingRecursiveGaussianImageFilterMod generating data "); const typename TInputImage::ConstPointer inputImage( this->GetInput() ); const typename TInputImage::RegionType region = inputImage->GetRequestedRegion(); const typename TInputImage::SizeType size = region.GetSize(); for( unsigned int d=0; d < ImageDimension; d++) { if( size[d] < 4 ) { itkExceptionMacro("The number of pixels along dimension " << d << " is less than 4. This filter requires a minimum of four pixels along the dimension to be processed."); } } // Create a process accumulator for tracking the progress of this minipipeline ProgressAccumulator::Pointer progress = ProgressAccumulator::New(); progress->SetMiniPipelineFilter(this); // Register the filter with the with progress accumulator using // equal weight proportion for( unsigned int i = 0; iRegisterInternalFilter(m_SmoothingFilters[i],1.0 / (ImageDimension)); } progress->RegisterInternalFilter(m_FirstSmoothingFilter,1.0 / (ImageDimension)); m_FirstSmoothingFilter->SetInput( inputImage ); m_CastingFilter->Update(); this->GraftOutput(m_CastingFilter->GetOutput()); } template void SmoothingRecursiveGaussianImageFilterMod ::PrintSelf(std::ostream& os, Indent indent) const { Superclass::PrintSelf(os,indent); os << "NormalizeAcrossScale: " << m_NormalizeAcrossScale << std::endl; } } // end namespace itk #endif