// ------------------------------------------------------------------------- // @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co) // ------------------------------------------------------------------------- #ifndef __cpExtensions__Algorithms__DiscontinuityMapImageFilter__hxx__ #define __cpExtensions__Algorithms__DiscontinuityMapImageFilter__hxx__ #include #include #include #include #include // ------------------------------------------------------------------------- template< class _TInputImage > cpExtensions::Algorithms::DiscontinuityMapImageFilter< _TInputImage >:: DiscontinuityMapImageFilter( ) : Superclass( ), m_UseSquareRoot( false ) { } // ------------------------------------------------------------------------- template< class _TInputImage > cpExtensions::Algorithms::DiscontinuityMapImageFilter< _TInputImage >:: ~DiscontinuityMapImageFilter( ) { } // ------------------------------------------------------------------------- template< class _TInputImage > void cpExtensions::Algorithms::DiscontinuityMapImageFilter< _TInputImage >:: ThreadedGenerateData( const TRegion& region, itk::ThreadIdType threadId ) { unsigned int i; itk::ZeroFluxNeumannBoundaryCondition< TInputImage > nbc; itk::ConstNeighborhoodIterator< TInputImage > bit; itk::ImageRegionIterator< TOutputImage > it; // Allocate output typename TOutputImage::Pointer output = this->GetOutput( ); typename TInputImage::ConstPointer input = this->GetInput( ); // Find the data-set boundary "faces" typename itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< TInputImage >::FaceListType faceList; itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< TInputImage > bC; faceList = bC( input, region, this->GetRadius( ) ); typename itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator< TInputImage >::FaceListType::iterator fit; TOutputPixel sum1, sum2; TOutputPixel neighborhoodSize; // Process each of the boundary faces. These are N-d regions which border // the edge of the buffer. for( fit = faceList.begin( ); fit != faceList.end( ); ++fit ) { bit = itk::ConstNeighborhoodIterator< TInputImage >( this->GetRadius( ), input, *fit ); neighborhoodSize = bit.Size( ); it = itk::ImageRegionIterator< TOutputImage >( output, *fit ); bit.OverrideBoundaryCondition( &nbc ); bit.GoToBegin( ); while( !bit.IsAtEnd( ) ) { sum1 = itk::NumericTraits< TOutputPixel >::ZeroValue( ); sum2 = itk::NumericTraits< TOutputPixel >::ZeroValue( ); for ( i = 0; i < neighborhoodSize; ++i ) { TOutputPixel v = TOutputPixel( bit.GetPixel( i ) ); sum1 += v; sum2 += v * v; } TOutputPixel mean = ( sum1 / TOutputPixel( neighborhoodSize ) ); TOutputPixel var = ( sum2 - ( ( sum1 * sum1 ) / TOutputPixel( neighborhoodSize ) ) ) / ( TOutputPixel( neighborhoodSize ) - TOutputPixel( 1 ) ); if( this->m_UseSquareRoot ) it.Set( std::sqrt( double( var ) ) ); else it.Set( var ); ++bit; ++it; } // elihw } // rof } #endif // __cpExtensions__Algorithms__DiscontinuityMapImageFilter__hxx__ // eof - $RCSfile$